裸PRIM 没什么好说的
#include<iostream>
using namespace std;
#define MAXSIZE 2010
#define INF 100000
int map[MAXSIZE][MAXSIZE];
int dp[MAXSIZE][MAXSIZE];
int n;
int vis[MAXSIZE];
int dis[MAXSIZE];//记录已有的树到该点的最短距离
int prim()
{
int i,j,ans=0;
memset(vis,0,sizeof(vis));
//把第一个顶点加入集合
vis[1]=1;
for(i=1;i<=n;i++)
{
dis[i]=map[1][i];
}
dis[1]=0;
for(i=1;i<n;i++)//循环n-1次 每次得到一个顶点
{
//找一个与已生成的树相连 并且权值最小的顶点
int min=INF;
int index=-1;
for(j=1;j<=n;j++)
{
if(!vis[j]&&dis[j]!=0)//还没有加入集合并且 与现有的树有边相连
{
if(min>dis[j])
{
min=dis[j];
index=j;
}
}
}
//将找到的点加入已有的树
vis[index]=1;
//将这条边的权值保存
ans+=min;
//更新dis 数组
for(j=1;j<=n;j++)
{
if(!vis[j]&&dis[j]!=0&&dis[j]>map[index][j])
dis[j]=map[index][j];
}
}
return ans ;
}
int main()
{
char truck[MAXSIZE][7];
// freopen("in.txt","r",stdin);
while(true)
{
scanf("%d",&n);
if(!n)
break;
memset(map,0,sizeof(map));
for(int i=1;i<=n;i++)
{
scanf("%s",truck[i]);
for(int j=1;j<i;j++)
{
int tnum=0;
for(int k=0;k<7;k++)//比较两个字符串之间有几个不同的字母
{
if(truck[i][k]!=truck[j][k])
tnum++;
}
map[i][j]=map[j][i]=tnum;
}
}
printf("The highest possible quality is 1/%d.\n",prim());
}
return 0;
}