wa了一次,因为把结果输出时没有输出 ".",很活该。prim算法求最小生成树,不过不需要保存边,只需要把最小的分母几下就是了。
代码如下:
/*
Poj: 1789 Truck History
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#define MaxDiff 1000
#define MaxP 2005
using namespace std;
char str[MaxP][8];
int dis[MaxP];
int n;
bool isIn[MaxP];
int CalDis(int i, int j);
int Prim();
int main()
{
//freopen("data.in", "rb", stdin);
while(scanf("%d", &n) != EOF && n != 0) {
for(int i = 0; i < n; i++) {
scanf("%s", str[i]);
}
memset(dis, 0, sizeof(dis));
printf("The highest possible quality is 1/%d.\n", Prim());
}
return 0;
}
int CalDis(int i, int j)
{
int t = 0;
for(int k = 0; k < 7; k++) {
if(str[i][k] != str[j][k]) {
t++;
}
}
return t;
}
int Prim()
{
int shortest = 0;
for(int i = 1; i < n; i++) {
isIn[i] = false;
}
isIn[0] = true;
for(int j = 1; j < n; j++) {
dis[j] = CalDis(0, j);
}
for(int i = 0; i < n - 1; i++) {
int tmp = MaxDiff;
int tmp_index = 0;
for(int j = 0; j < n; j++) {
if(!isIn[j] && dis[j] < tmp) {
tmp_index = j;
tmp = dis[j];
}
}
isIn[tmp_index] = true;
shortest += tmp;
for(int k = 0; k < n; k++) {
if(!isIn[k] && dis[k] > CalDis(k, tmp_index))
dis[k] = CalDis(k, tmp_index);
}
}
return shortest;
}