标签:
/* *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