prim就行
不同字母为距离
注意几个地方
第一
能不用string就不用string,就因为他超时了;
第二
cost[i][j]
最好是i i+1
不要是1 1这样for循环
前者跑了438
后者跑了579ms
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
const int INF=1e9+7;
const int maxn=2005;
int cost[maxn][maxn];
bool visit[maxn];
int mincost[maxn];
int n;
char p[maxn][8];
int diff(char a[],char b[])
{
int sum=0;
for(int i=0;i<7;i++)
if(a[i]!=b[i]) sum++;
return sum;
}
int prim()
{
for(int i=1;i<=n;i++)
mincost[i]=INF;
memset(visit,false,sizeof(visit));
mincost[1]=0;
int res=0;
for(int i=1;i<=n;i++){
int v=-1;
for(int u=1;u<=n;u++)
if(!visit[u]&&(v==-1||mincost[u]<mincost[v])) v=u;
if(v==-1) break;
visit[v]=true;
res+=mincost[v];
for(int u=1;u<=n;u++){
mincost[u]=min(mincost[u],cost[v][u]);
}
}
return res;
}
int main()
{
while(~scanf("%d",&n)&&n){
for(int i=1;i<=n;i++){
scanf("%s",p[i]);
}
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
cost[i][j]=cost[j][i]=diff(p[i],p[j]);
printf("The highest possible quality is 1/%d.\n",prim());
}
}