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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值