题目:http://poj.org/problem?id=1789
题意:用7个小写字母来表示每种truck的型号,每两种型号之间的差距为字母串中不同字母的个数。现在给出n种不同型号的truck,找到一条连接所有truck的最短路径。
#include<stdio.h>
#include<string.h>
const int inf=999999999;
char str[2005][10];
int vis[2005],d[2005];
int n;
int sum(int i,int j)
{
int ans=0,k;
for(k=0;k<7;k++)
{
if(str[i][k]!=str[j][k])
ans++;
}
return ans;
}
void prim()
{
int i,j,s=0,cur;
memset(vis,0,sizeof(vis));
d[0]=0,vis[0]=1;
for(i=1;i<n;i++)
d[i]=sum(0,i);
for(i=0;i<n-1;i++)
{
int min=inf;
for(j=0;j<n;j++)
{
if(vis[j]==0&&min>d[j])
{
min=d[j];
cur=j;
}
}
vis[cur]=1;
s+=d[cur];
for(j=0;j<n;j++)
{
if(vis[j]==0&&d[j]>sum(cur,j))
d[j]=sum(cur,j);
}
}
printf("The highest possible quality is 1/%d.\n",s);
}
int main()
{
int i,j;
while(scanf("%d",&n),n)
{
for(i=0;i<n;i++)
scanf("%s",str[i]);
prim();
}
return 0;
}