题目描述:
字符串看做点,字符串之间距离(不同字符的个数)看做边权。求1/最小生成树值。
解题思路:
水题。就是求最小生成树。这里面应该是点数明显少于边数的,所以选prim。
代码:
#include <stdio.h>
#include <stdlib.h>
#define N 2001
#define Infinity 7
char input[N][8];
int G[N][N];
int visit[N], D[N];
int dis(int i, int j)
{
int k, sum=0;
if(i == j)
return 0;
for(k=0;k<7;k++)
if(input[i][k] != input[j][k])
sum++;
return sum;
}
main()
{
int n,i,j,min,pos,sum;
scanf("%d",&n);
while(n!=0)
{
// get input
for(i=1;i<=n;i++)
scanf("%s",input[i]);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i != j)
G[i][j] = dis(i, j);
for(i=1;i<=n;i++)
{
visit[i] = 0;
D[i] = Infinity;
}
visit[1] = 1;
for(i=2;i<=n;i++)
D[i] = G[1][i];
//prim
sum = 0;
for(j=2;j<=n;j++)
{
min = Infinity;
for(i=2;i<=n;i++)
if(!visit[i] && D[i] <= min)
{
min = D[i];
pos = i;
}
sum += min;
visit[pos] = 1;
//update
for(i=2;i<=n;i++)
if(!visit[i] && G[pos][i] < D[i])
D[i] = G[pos][i];
}
printf("The highest possible quality is 1/%d.\n",sum);
scanf("%d",&n);
}
//system("pause");
return 0;
}