您的位置:首页 > 其它

poj 1789 Truck History(图论:最小生成树)

2014-07-21 16:15 323 查看
让我再水这一题


题目读不懂是硬伤...

题意是把每行字符串看做一个节点,两个字符串之间不同字符数看做距离

求最小生成树

要注意到这里是完全图,因此用prim比较好

代码如下:

#include <cstdio>
#include <iostream>
#include <algorithm>
#define MAXN 10010
#define LL long long
#define INF 0x7fffffff
using namespace std;

int n, dis[MAXN], g[MAXN][MAXN];
char str[MAXN][10];

int get_dis(int i, int j) {
int k, cnt = 0;
for(k=0; k<7; ++k) {
if(str[i][k] != str[j][k])
cnt++;
}
return cnt;
}

LL prim() {
int now, minedge, minnode, i, j;
LL ans;
for(i=0; i<n; ++i)
dis[i] = INF;
now = 0;
ans = 0;
for(i=0; i<n-1; ++i) {
dis[now] = -1;
minedge = INF;
for(j=0; j<n; ++j) {
if(now!=j && dis[j]>=0) {
dis[j] = min(dis[j], g[now][j]);
if(dis[j] < minedge) {
minedge = dis[j];
minnode = j;
}
}
}
now = minnode;
ans += minedge;
}
return ans;
}

int main(void) {
int i, j;
while(scanf("%d", &n) && n) {
for(i=0; i<n; ++i)
scanf("%s", str[i]);
for(i=0; i<n; ++i) {
for(j=i+1; j<n; ++j) {
g[i][j] = g[j][i] = get_dis(i, j);
}
}
printf("The highest possible quality is 1/%lld.\n", prim());
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: