题意:计算一个派生计划值,其实就是 1/最小生成树。
思路:prim搞之,这题距离给的比较特别,如
aaaaaaa
baaaaaa
计算7位字符串的不同的位数就是该两点之间的距离。
其他没啥。
反思:少写条件还忘记初始化,该醒醒了。。。。。。
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 1<<29
using namespace std;
int n,p[2005][2005],ans,d[2005];
char a[2005][8];
bool v[2005];
void prim()
{
memset(v,0,sizeof(v));
for(int i=0;i<n;i++)d[i]=p[0][i];
v[0]=1;
for(int j=1;j<n;j++)
{
int index=-1;
int mi=maxn;
for(int i=0;i<n;i++)
{
if(d[i]<mi&&!v[i])
{
mi=d[i];
index=i;
}
}
if(index!=-1)
{
v[index]=1;
ans+=d[index];
for(int i=0;i<n;i++)
{
if(!v[i]&&d[i]>p[index][i])
{
d[i]=p[index][i];
}
}
}
}
}
int main()
{
while(scanf("%d",&n)&&n)
{
for(int i=0;i<n;i++)
{
scanf("%s",a[i]);
for(int j=i-1;j>=0;j--)
{
int len=0;
for(int k=0;k<7;k++)
{
if(a[i][k]!=a[j][k])len++;
}
p[i][j]=p[j][i]=len;
}
p[i][i]=maxn;
}
ans=0;
prim();
printf("The highest possible quality is 1/%d.\n",ans);
}
return 0;
}