题目地址:http://poj.org/problem?id=1789
图论(最短路、最小生成树)部分小结的地址:http://www.cnblogs.com/aiyelinglong/archive/2012/03/26/2418707.html
小结:现在才知道原来prime和dijkstra只有很小一部分不一样。
#include <iostream>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
typedef long long ll;
#define INF 0xfffffff
#define MAX(a,b) a>b?a:b
#define MIN(a,b) a>b?b:a
#define N 2005
char s[N][10];
short int map[N][N];
short int visited[N];
int pos[N];
int n;
void prime(int st){
memset(visited,0,sizeof(visited));
visited[st]=1;
for(int i=0;i<n;i++){
pos[i]=map[st][i];
}
int minn,next,sum=0,j;
for(int i=1;i<n;i++){
minn=INF;
for(j=0;j<n;j++){
if(!visited[j]&&pos[j]<minn){
next=j;
minn=pos[j];
}
}
visited[next]=j;
sum+=minn;
for(int j=0;j<n;j++){
if(!visited[j]&&map[next][j]<pos[j]){
pos[j]=map[next][j];
}
}
}
printf("The highest possible quality is 1/%d.\n",sum);//cout<<sum<<endl;
}
int main()
{
int i,j,k,t;
int m,num,count;
while(scanf("%d",&n)!=-1&&n){
cin>>s[0];
for(i=1;i<n;i++){
cin>>s[i];
for(j=0;j<i;j++){
count=0;
for(k=0;k<7;k++){
if(s[i][k]!=s[j][k]) count++;
}
map[i][j]=count;
map[j][i]=count;
}
}
prime(0);
}
return 0;
}