题目大意:
新卡车的类型编码是由第1个卡车类型编码派生出来的,新的卡车类型编码又派生出其他类型编码。类型编码由7个字符组成,每两个编码中 字符不同的位置个数 是两类型编码间的距离。派生方案的优劣值定义成1/Σ(to,td)d(to,td),求和部分 是所有类型对(t0,td)的距离之和,t0是基类型,td为派生出来的类型。公司的卡车类型很多,历史学家很难判定这些类型编码间的派生关系,现在要求求出 所有派生方案优劣值 的 最高优劣值。(所有的类型编码各不相同)
优劣值最高,即式中分母最小,即 最小生成树~
AC代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 2003
int edge[N][N],lowcost[N],n;
char typ[N][10];
void init()
{
memset(edge,0,sizeof(edge));
int i,j,k,temp;
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
temp=0;
for(k=0;k<7;k++)
temp+=typ[i][k]!=typ[j][k];
edge[i][j]=edge[j][i]=temp;
}
}
for(i=1;i<n;i++)
lowcost[i]=edge[0][i];
lowcost[0]=-1;
}
int prim()
{
int sum=0,i,j,k,min;
for(i=1;i<n;i++)
{
min=1000000;
for(j=0;j<n;j++)
{
if(lowcost[j]!=-1&&lowcost[j]<min)
{
k=j;
min=lowcost[j];
}
}
lowcost[k]=-1;
sum+=min;
for(j=0;j<n;j++)
{
if(lowcost[j]>edge[k][j])
lowcost[j]=edge[k][j];
}
}
return sum;
}
int main()
{
int i;
while(scanf("%d",&n)!=EOF&&n)
{
for(i=0;i<n;i++)
scanf("%s",typ[i]);
init();
printf("The highest possible quality is 1/%d.\n",prim());
}
return 0;
}