URAL 1709 Penguin-Avia

#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)