#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;
}
URAL 1709 Penguin-Avia
最新推荐文章于 2019-09-12 17:05:41 发布