POJ1789

普里姆算法入门题

 题目大意:给你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;

 }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值