标签:
/*
*POJ 1789 Truck History
*不同类型卡车之间的距离为编码对应位不同的个数(如 aaaaaaa 和 babaaaa 距离为2)
*求最小生成树
*/
#include <cstdio>
#include <cstring>
#define INF 1000000
#define MAXN 2000
#define CODELEN 7
int n;
char codes[MAXN][CODELEN + 1]; //每种卡车编码
int d[MAXN][MAXN]; //邻接矩阵
int lowcost[MAXN]; // 节点i 距离已合并集合的最小权值
void init()
{
int i, j, k;
int dist;
memset(d, 0, sizeof(d));
for (i = 0; i < n; i++) {
for (j = i + 1; j < n; j++) {
dist = 0;
for (k = 0; k < 7; k++) {
dist += codes[i][k] != codes[j][k];
}
d[i][j] = d[j][i] = dist;
}
}
}
int prim()
{
int i, j, k;
int sum = 0;
lowcost[0] = -1; //从顶点0开始构造
for (i = 1; i < n; i++) {
lowcost[i] = d[0][i];
}
for (i = 1; i < n; i++) {
int min = INF;
for (k = 0; k < n; k ++) {
if (lowcost[k] != -1 && lowcost[k] < min) {
j = k;
min = lowcost[k];
}
}
sum += min;
lowcost[j] = -1; //把顶点j加入生成树
for (k = 0; k < n; k++) {
if (d[j][k] < lowcost[k]) {
lowcost[k] = d[j][k];
}
}
}
return sum;
}
int main()
{
int i;
while (scanf("%d", &n) && n) {
for (i = 0; i < n; i++) {
scanf("%s", codes[i]);
}
init();
printf("The highest possible quality is 1/%d.\n", prim());
}
return 0;
}
标签:
原文地址:http://www.cnblogs.com/subrshk/p/4241568.html