题意晦涩难懂,参考http://blog.csdn.net/lyy289065406/article/details/6645974
使用Prim算法:
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
#define INF 0x7fffffff
const int MAX = 2001;
int map[MAX][MAX]; //邻接矩阵
int n;
int lowcost[MAX]; //最小权值
int vis[MAX];
char str[MAX][8];
int main()
{
int i,j,k,distance,pos,min,ans;
while(cin>>n && n)
{
/* 构造图 */
for(i = 0;i < n;i++)
{
scanf("%s",str[i]);
}
for(i = 0;i < n;i++)
for(j = i+1;j < n;j++)
{
distance = 0;
for(k = 0;k < 7;k++)
if(str[i][k] != str[j][k]) distance++;
map[i][j] = map[j][i] = distance;
}
memset(vis,0,n*sizeof(int));
ans = 0;
vis[0] = 1; pos = 0; //默认从第一个结点开始
for(i = 1;i < n;i++) lowcost[i] = map[pos][i]; //初始化最小权值
for(j = 1;j < n;j++) //重复n-1次
{
min = INF;
for(i = 1;i < n;i++) //找边权值最小的对应结点
if(!vis[i] && min > lowcost[i])
{
min = lowcost[i];
pos = i;
}
ans += min;
vis[pos] = 1;
for(i = 1;i < n;i++) //刷新最小权值
{
if(!vis[i] && lowcost[i] > map[pos][i])
lowcost[i] = map[pos][i];
}
}
printf("The highest possible quality is 1/%d.\n",ans);
}
//system("pause");
return 0;
}