POJ-1789-Truck History
http://poj.org/problem?id=1789
最小生成树
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define M 2000
#define INF 99999999
char str[M][8];
int map[M][M];
int visit[M];
int dis[M];
int n;
void prim()
{
int i,j,temp,v,ans;
memset(visit,0,sizeof(visit));
visit[1]=1;
for(i=1;i<=n;i++)
dis[i]=map[1][i];
dis[1]=0;
ans=0;
for(i=1;i<n;i++)
{
temp=INF;
for(j=1;j<=n;j++)
if(!visit[j]&&dis[j]<temp)
{
temp=dis[j];
v=j;
}
visit[v]=1;
ans+=temp;
for(j=1;j<=n;j++)
if(!visit[j]&&map[v][j]<dis[j])
dis[j]=map[v][j];
}
printf("The highest possible quality is 1/%d.\n",ans);
}
int main()
{
int i,j,k,sum;
while(scanf("%d",&n),n)
{
memset(map,0,sizeof(map));
for(i=1;i<=n;i++)
{
scanf("%s",str[i]);
map[i][i]=0;
for(j=1;j<i;j++)
{
sum=0;
for(k=0;k<7;k++)
if(str[i][k]!=str[j][k])
sum++;
map[i][j]=map[j][i]=sum;
}
}
prim();
}
return 0;
}