POJ 1789 Truck History (最小生成树kruskal算法)

这道题用kruskal算法和prim算法都可以,我用的是kruskal算法,题目大概意思就是给你一个数n,接下来n行,每行由7个字母组成每个字母代表不同的车厢,其中有1个火车是原来的火车,剩余的n-1个火车都是由第一个火车经过各种变换得到的,比如aaaaaaa可以变化成baaaaaaa需要变化1次,然后baaaaaa可以变化成bbaaaaa也需要1次,这样的话
3
aaaaaaa
baaaaaa
bbaaaaa
这个例子的答案就是2
这个题还需要注意的地方是在判断火车相差几个不同的车厢时候要用到3个for循环,同时那个结构体数组开的大点,要不会报错,其它的地方就没什么好说的了,看代码

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<algorithm>
#include<iostream>
using namespace std;
int f[107000];
 int sum;
 char s1[2005][7];
struct lll
{
   int x,y,z;
}s[4460000];
int found(int x)
{
    if(x!=f[x])
    {
        f[x]=found(f[x]);
    }
    return f[x];
}
int lsz(lll a,lll b)
{
    return a.z<b.z;
}
void merch1(int x,int y,int z)
 {
     int x1=found(x),y1=found(y);
     if(x1!=y1)
     {
         f[x1]=y1;
         sum+=z;
     }
     return ;
 }
int main()
{
   int t;
   while(~scanf("%d",&t)&&t)
   {
       sum=0;
       int l=0;
       for(int a=0;a<t;a++)
       {
           scanf("%s",s1[a]);
       }
       for(int a=0;a<=10000;a++)
       {
           f[a]=a;
       }
       for(int i=0;i<t;i++)
       {

           for(int j=t-1;j>=i;j--)
           {
               int k=0;
               for(int a=0;a<7;a++)
               {
                 if(s1[i][a]!=s1[j][a])
                 {
                 k++;
                 }
               }
             s[l].x=i,s[l].y=j,s[l].z=k;
             l++;
           }

       }
       sort(s,s+l,lsz);
       for(int a=0;a<l;a++)
       {
           merch1(s[a].x,s[a].y,s[a].z);
       }
       printf("The highest possible quality is 1/%d.\n",sum);
   }
    return 0;
}



猜你喜欢

转载自blog.csdn.net/weixin_44122831/article/details/88667473