zoj 2326 Tangled in Cables 最小生成树

来源:互联网 发布:陕西干部网络培训答案 编辑:程序博客网 时间:2024/05/22 12:06
嗯,写最小生成树终于有感觉了,一次就AC了,比前两道好多了,不过,这次我没有用qsort,还是用了一般的排序,看来qsort是得好好学学了,这样,我的代码可以短很多,看着也会舒服了。。。
#include<stdio.h>#include<string.h>typedef struct{    int x,y;    double w;}NODE; NODE node[10000];int pre[5000];void  change1(int *x,int *y)  {      int t;     t=*x;     *x=*y;     *y=t;  }  void change2(double *x,double *y){     double t;     t=*x;     *x=*y;     *y=t;  }int find(int x){    while(x!=pre[x])      x=pre[x];    return x;}  void kruskal(int k,double total){    int i,j,a,b,h;    double sum=0.0;    for(i=0;i<k-1;i++)         {             h=i;             for(j=i+1;j<k;j++)                if(node[h].w>node[j].w)                      h=j;                                           if(h!=i)             {                  change1(&node[i].x,&node[h].x);                 change1(&node[i].y,&node[h].y);                  change2(&node[i].w,&node[h].w);                            }          }           for(i=0;i<k;i++)    {        a=find(node[i].x);        b=find(node[i].y);        if(a!=b)        {            sum+=node[i].w;            pre[b]=a;        }    }    if(sum>total)       printf("Not enough cable\n");    else       printf("Need %.1lf miles of cable",sum);              }int main(){   double total;   int i,j,house,paths,k;   char a[5000][25],b[25],c[25];   scanf("%lf%d",&total,&house);   for(i=1;i<=house;i++)      pre[i]=i;         for(i=1;i<=house;i++)      scanf("%s",a[i]);        scanf("%d",&paths);      for(i=0;i<paths;i++)   {        k=0;        scanf("%s%s%lf",b,c,&node[i].w);                for(j=1;j<=house;j++)        {            if(strcmp(b,a[j])==0)            {               node[i].x=j;               k++;            }            if(strcmp(c,a[j])==0)            {                k++;                node[i].y=j;            }            if(k==2)               break;        }      }   kruskal(paths,total);     return 0;  }
呵呵,不错不错,我改了一下,把qsort加了进去,没出现让人头疼的Floating Point Error ,这样代码看着就舒服了。。
#include<stdio.h>#include<string.h>typedef struct{    int x,y;    double w;}NODE; NODE node[10000];int pre[5000];int cmp(const void *a,const void *b)    {        return ((NODE*)a)->w > ((NODE*)b)->w ? 1 : -1;    }    int find(int x){    while(x!=pre[x])      x=pre[x];    return x;}  void kruskal(int k,double total){    int i,j,a,b,h;    double sum=0.0;    qsort(node,k,sizeof(NODE),cmp);        for(i=0;i<k;i++)    {        a=find(node[i].x);        b=find(node[i].y);        if(a!=b)        {            sum+=node[i].w;            pre[b]=a;        }    }    if(sum>total)       printf("Not enough cable\n");    else       printf("Need %.1lf miles of cable",sum);              }int main(){   double total;   int i,j,house,paths,k;   char a[5000][25],b[25],c[25];   scanf("%lf%d",&total,&house);   for(i=1;i<=house;i++)      pre[i]=i;   for(i=1;i<=house;i++)      scanf("%s",a[i]);      scanf("%d",&paths);      for(i=0;i<paths;i++)   {        k=0;        scanf("%s%s%lf",b,c,&node[i].w);                for(j=1;j<=house;j++)        {            if(strcmp(b,a[j])==0)            {               node[i].x=j;               k++;            }            if(strcmp(c,a[j])==0)            {                k++;                node[i].y=j;            }            if(k==2)               break;        }      }   kruskal(paths,total);     return 0;  }


原创粉丝点击