基本就是裸的算法
当模板用把。。
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
#define MAX 2014
#define P pair<int,int>
#define fst first
#define sec second
#define MS(x) memset(x,0,sizeof(x))
char car[MAX][20];
int d[MAX][MAX];
int minCost[MAX];
int used[MAX];
int diff(char s1[],char s2[])
{
int di=0;
for(int i=0;i<7;i++)
if(s1[i]!=s2[i])
di++;
return di;
}
priority_queue<P,vector<P>,greater<P> > q;
int main()
{
int n;
while(scanf("%d",&n)&&n!=0)
{
MS(d);
MS(used);
while(!q.empty())
q.pop();
for(int i=0;i<MAX;i++)
minCost[i]=0x3f3f3f3f;
for(int i=0;i<MAX;i++)
for(int j=0;j<MAX;j++)
d[i][j]=0x3f3f3f3f;
for(int i=0;i<n;i++)
scanf("%s",car[i]);
for(int i=0;i<n;i++)
for(int j=0;j<i;j++)
{
int t=diff(car[i],car[j]);
d[i][j]=d[j][i]=t;
}
q.push(P(0,0));
int ans=0;
for(int i=0;i<n;i++)// 这里一定要是 n 次因为第一次不算加边
{
while(used[q.top().sec])
q.pop();
P tp=q.top();
q.pop();
ans+=tp.fst;
int v=tp.sec;
used[v]=1;
for(int j=0;j<MAX;j++)
{
if(!used[j]&&d[v][j]<minCost[j])
{
q.push(P(d[v][j],j));
minCost[j]=d[v][j];
}
}
}
printf("The highest possible quality is 1/%d.\n",ans);
}
return 0;
}