zoj3204 Connect them 最小生成树 MST

本文详细解读了最小生成树算法的实现过程,并通过实例展示了如何使用 Kruskal 算法解决实际问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这道题,有几个地方,来看看:
#include<stdio.h>
#include<stdlib.h>
typedef struct
{
    int x,y;
    int w;
}NODE;
typedef struct
{
    int x1;
    int x2;
}xx;
xx tt[1005];
NODE node[5005];
int a[105][105],k,pre[105],temp[1000];
int find(int x)
{
    while(x!=pre[x])
      x=pre[x];
    return x;  
}
int cmp(const void *a,const void *b)      
{   
    if( ((NODE*)a)->w != ((NODE*)b)->w)
       return ((NODE*)a)->w > ((NODE*)b)->w ? 1 : -1;
    else
       if( ((NODE*)a)->x != ((NODE*)b)->x)
          return  ((NODE*)a)->x > ((NODE*)b)->x ? 1 : -1;
       else
          return  ((NODE*)a)->y > ((NODE*)b)->y ? 1 : -1;   
} 
int cmp2(const void *a,const void *b)
{
    if(  ((xx*)a)->x1 != ((xx*)b)->x1)
       return ((xx*)a)->x1 > ((xx*)b)->x1 ? 1 : -1;
    else
       return ((xx*)a)->x2 > ((xx*)b)->x2 ? 1 : -1;
    }   
int  kruskal()
{
    int i,v1,v2,q=0;
    
    qsort(node,k,sizeof(NODE),cmp);    
    for(i=0;i<k;i++)
    {
        v1=find(node[i].x);
        v2=find(node[i].y);
        if(v1!=v2&&node[i].w!=0)
        {
            tt[q].x1=node[i].x;
            tt[q].x2=node[i].y;
            pre[v2]=v1;
            q++;
        }
    }
    return q;
}
int main()
{
   int t,n,i,j,num;
   scanf("%d",&t);
   while(t--)
   {
      k=0;  
      scanf("%d",&n);
      
      for(i=1;i<=n;i++)
        pre[i]=i;
      
      for(i=1;i<=n;i++)
         for(j=1;j<=n;j++)
            scanf("%d",&a[i][j]);
      for(i=1;i<=n;i++)
        for(j=i+1;j<=n;j++)
        {
            node[k].x=i;
            node[k].y=j;
            node[k].w=a[i][j];
            k++;
        }      
      num=kruskal();
      if(num==n-1)
      {
      qsort(tt,num,sizeof(xx),cmp2);
         for(i=0;i<num-1;i++)
              printf("%d %d ",tt[i].x1,tt[i].x2);
         printf("%d %d\n",tt[num-1].x1,tt[num-1].x2);
      } 
      else
        printf("-1\n");
    }    
     return 0;
  }

这个代码是AC的,如果把第14行节点大小定义为NODE  node[1005]。。。。是的,最初没考虑全,开小了,可是也不至于直接就给我WA!!!!!!!!本来开始时想到了用多级排序就可以搞定输出,很得意,可这个刚开始的WA让我一下子就没了感觉了。。。该死的WA。。。。。

还有,最后的qsort放在if之外也能过,不过费时了。

嗯,如果当时直接把数组开大点的话,也就不用这么纠结了,唉唉唉唉唉。。。。。。不过,总算AC了,最小生成树就先告一段落了,尽管用的只是kruskal,回头再练prime吧,下一步DP。。。奋斗

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值