POJ 1789 Truck History (MST.Prim)

感觉还是理解题目比较难一些。。

算法还是Prim,没有特别 的变化。之前都按自己的理解写的Prim,这次看了算法导论中的伪代码,原来Prim还有更快速的实现方法。这个方法把与树的距离用一个域储存了一起,这样就不用每次都查找与树相邻的边了。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<string>
#include<algorithm>
#include<climits>
#define FOR(i, N) for(int i = 1; i <= (N); i++)
using namespace std;

int cost[2001][2001];
char code[2001][10];

int getDist(int i, int j){
	int dist = 0;
	FOR(k, 7){
		if(code[i][k - 1] != code[j][k - 1])
			dist++;
	}
	return dist;
}

void read(int N){
	FOR(i, N){
		scanf("%s", code[i]);
		FOR(j, i){
			cost[i][j] = cost[j][i] = getDist(i, j);
		}
	}
}

int Prim(int N){
	int distTotal = 0;
	int key[2001];
	bool inTree[2001];
	FOR(i, N)
		key[i] = INT_MAX;
	memset(inTree, false, sizeof(inTree));
	key[1] = 0;
	
	FOR(i, N){
		int keyMin = INT_MAX;
		int index;
		FOR(i, N)
			if(!inTree[i] && keyMin > key[i]){
				keyMin = key[i];
				index = i;
			}
		FOR(i, N){
			if(key[i] > cost[index][i])
				key[i] = cost[index][i];
		}
		distTotal += keyMin;
		inTree[index] = true;
	}
	return distTotal;
}

int main(){
	int N;
	while(cin >> N && N != 0){
		read(N);
		printf("The highest possible quality is 1/%d.\n", Prim(N));
	}
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值