您的位置:首页 > 产品设计 > UI/UE

URAL 1709 Penguin-Avia

2015-10-09 17:16 246 查看
#include <stdio.h>
#define MAX_AIRPORTS 100
int numOfAirports;
int cancelCost, introduceCost;
char airline[MAX_AIRPORTS + 1][MAX_AIRPORTS + 1];
int set[MAX_AIRPORTS + 1];
int rank[MAX_AIRPORTS + 1];
//最小花费很大,注意要用long long才够
long long minCost;

void makeSet(){
int airport;
for (airport = 0; airport < numOfAirports; airport++){
set[airport] = airport;
rank[airport] = 0;
}
}

int findSet(int airport){
if (set[airport] != airport)
set[airport] = findSet(set[airport]);
return set[airport];
}

void unionSet(int one, int another){
if (rank[one] < rank[another])
set[one] = another;
else {
set[another] = one;
if (rank[one] == rank[another])
rank[one]++;
}
}

int main(){

scanf("%d%d%d", &numOfAirports, &cancelCost, &introduceCost);

makeSet();

int from, to;
for (from = 0; from < numOfAirports; from++)
scanf("%s", airline[from]);

for (from = 0; from < numOfAirports; from++)
for (to = from + 1; to < numOfAirports; to++){
if (airline[from][to] == '1'){
int fromSet = findSet(from);
int toSet = findSet(to);
if (fromSet != toSet){
unionSet(fromSet, toSet);
airline[from][to] = airline[to][from] = '0';
} else {
airline[from][to] = airline[to][from] = 'd';
minCost += cancelCost;
}
}
}

for (from = 0; from < numOfAirports; from++)
for (to = from + 1; to < numOfAirports; to++){
int fromSet = findSet(from);
int toSet = findSet(to);
if (fromSet != toSet){
unionSet(fromSet, toSet);
airline[from][to] = airline[to][from] = 'a';
minCost += introduceCost;
}
}

printf("%lld\n", minCost);

for (from = 0; from <= numOfAirports; from++)
printf("%s\n", airline[from]);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息