最小生成树 Prim。
题目:http://acm.hit.edu.cn/hoj/problem/view?id=1833
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <queue>
#include <math.h>
#include <algorithm>
using namespace std;
int map[2002][2002];
int dist[2002];
int visited[2002];
char c[2002][8];
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
int n;
while(scanf("%d",&n)!=EOF && n!=0)
{
for(int i=0; i<n; i++)
{
scanf(" %s",c[i]);
}
memset(map,0,sizeof(map));
for(int i=0; i<n; i++)
{
for(int j=i+1; j<n; j++)
{
int dif = 0;
for(int t=0; t<8; t++)
{
if(c[i][t]!=c[j][t])
{
dif++;
}
}
map[i][j] = map[j][i] = dif;
}
}
memset(dist,0x7f,sizeof(dist));
memset(visited,0,sizeof(visited));
dist[0] = 0;
int sum = 0;
for(int i=0; i<n; i++)
{
int min = 0x7f;
int k = 0;
for(int j=0; j<n; j++)
{
if(visited[j] == 0 && dist[j]<min)
{
min = dist[j];
k = j;
}
}
visited[k] = 1;
sum += min;
for(int j=0; j<n; j++)
{
if(dist[j] > map[k][j])
{
dist[j] = map[k][j];
}
}
}
printf("The highest possible quality is 1/%d.\n",sum);
}
return 0;
}