普里姆算法入门题
题目大意:给你n串长度为7的字符串,每两个字符串的距离就是他们中间相差的字符个数,现在求解将所有字符串变成一样的所化的最少代价。
思路:一旦两个字符串找到不一样的字符,就将这两个字符串的距离加1,最后求n个字符串的最小代价生成树。(注意最大距离写大点,贡献一个wa)
#include <stdio.h>
#include <string.h>
int map[2117][2117];
int book[2117];
char s[2117][10];
int n,sum;
void Prim()
{
int i,count,min,j;
int dis[2117];
for (i=0;i<n;i++)
dis[i]=map[0][i];
book[0]=1;
count=1;
while(count<n)
{
min=99999999;
for (i=0;i<n;i++)
if ((!book[i])&&(dis[i]<min))
{
min=dis[i];
j=i;
}
book[j]=1;
count++;
sum=sum+min;
for (i=0;i<n;i++)
if ((!book[i])&&(dis[i]>map[j][i]))
dis[i]=map[j][i];
}
}
int main()
{
int i,j,k;
while((scanf("%d",&n)==1)&&n)
{
memset(s,0,sizeof(s));
memset(book,0,sizeof(book));
memset(map,0,sizeof(map));
sum=0;
for (i=0;i<n;i++)
scanf("%s",s[i]);
for (i=0;i<n-1;i++)//第一个字符串的取值
for (j=i+1;j<n;j++)//第二个字符串的取值
for (k=0;k<7;k++)//每一个字符串的第几个字符
if (s[i][k]!=s[j][k])
{
map[i][j]++;
map[j][i]++;
}
for (i=0;i<n;i++)
for (j=0;j<n;j++)
if (!map[i][j])
map[i][j]=99999999;
Prim();
printf("The highest possible quality is 1/%d.\n",sum);
}
return 0;
}