对应POJ题目:点击打开链接
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<map>
#include<queue>
#include<stack>
#include<vector>
#include<algorithm>
#include<iomanip>
#include<cstring>
#include<string>
#include<iostream>
const int MAXN=2000+10;
const int INF=1<<30;
using namespace std;
int G[MAXN][MAXN];
int cp[MAXN];
int dis[MAXN];
int sum;
char truck[MAXN][10];
void prim(int n, int v)
{
int i,j;
for(i=0; i<n; i++){
dis[i]=G[v][i];
cp[i]=v;
}
for(i=1; i<n; i++){
int min=INF;
int k=v;
for(j=0; j<n; j++){
if(dis[j] && dis[j]<min){
min=dis[j];
k=j;
}
}
//printf("%d <-> %d = %d\n", cp[k], k, min);//打印两顶点与两点间权值
sum+=dis[k];//计算最短路径和
dis[k]=0;//加入集合
for(j=0; j<n; j++){
if(G[j][k] && G[j][k]<dis[j]){//更新候选边
dis[j]=G[j][k];
cp[j]=k;
}
}
}
printf("The highest possible quality is 1/%d.\n", sum);
}
int Distance(char const *str1, char const *str2)
{
const char *p;
const char *q;
int cnt=0;
for(p = str1, q = str2; *p && *q;)
if(*p++ != *q++) cnt++;
return cnt;
}
int main()
{
//freopen("in.txt","r",stdin);
int n;
while(scanf("%d", &n), n)//节点为0~n-1
{
sum=0;
int i,j;
for(i=0; i<n; i++) scanf("%s", truck[i]);
for(i=0; i<n; i++){//初始化图
for(j=0; j<n; j++){
if(i==j){ G[i][j]=0; continue;}
G[i][j]=INF;
}
}
for(i=0; i<n; i++){
for(j=i+1; j<n; j++){
int len = Distance(truck[i], truck[j]);
G[i][j] = G[j][i] = len;
}
}
prim(n, 0);
}
return 0;
}