zoj3204 Connect them 最小生成树

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3367

题目就是简单的最小生成树的模板的应用,不过最小生成树可能不唯一,答案要求输出字典序最小

代码:

  1 #include<cstdlib>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<iostream>
  5 #include<algorithm>
  6 using namespace std;
  7 #define maxn 110
  8 int n,tol;
  9 int cnt;
 10 class node
 11 {
 12     public:
 13     int from;
 14     int to;
 15     int w;
 16 };
 17 node edge[maxn*maxn];
 18 node ans[maxn*maxn];
 19 int parent[maxn*maxn];
 20 void addedge(int u,int v,int w)
 21 {
 22     edge[tol].from=u;
 23     edge[tol].to=v;
 24     edge[tol].w=w;
 25     tol++;
 26 }
 27 void UFset()
 28 {
 29     for(int i=0;i<maxn*maxn;i++)
 30        parent[i]=-1;
 31 }
 32 int Find( int x)
 33 {
 34    int s;
 35    for(s=x;parent[s]>=0; s=parent[s]);
 36    while(s!=x)
 37    {
 38       int tmp=parent[x];
 39       parent[x]=s;
 40       x=tmp;
 41    }
 42    return s;
 43 }
 44 void Union(int R1, int R2)
 45 {
 46     int root1=Find(R1);
 47     int root2=Find(R2);
 48 
 49     int tmp=parent[root1]+parent[root2];
 50 
 51     if(parent[root1]> parent[root2])
 52      {
 53          parent[root1]=root2;
 54          parent[root2]=tmp;
 55      }
 56      else
 57      {
 58          parent[root2]=root1;
 59          parent[root1]=tmp;
 60      }
 61 }
 62 bool cmp1( node a, node b)
 63 {
 64     if(a.w!=b.w)return a.w<b.w;
 65        else if(a.from!=b.from)return a.from<b.from;
 66           else return a.to<b.to; 
 67 }
 68 bool cmp2(node a, node b)
 69 {
 70   if(a.from!=b.from)return a.from<b.from;
 71      else return a.to<b.to; 
 72 }
 73 void Kruskal()
 74 {
 75    int num=0;
 76    int u,v;
 77    UFset();
 78    cnt=0;
 79 
 80    for(int i=0;i<tol;i++)
 81     {
 82        u=edge[i].from;
 83        v=edge[i].to;
 84        if(Find(u) != Find(v))
 85        {
 86            ans[cnt++]=edge[i];
 87            Union(u,v);
 88        }
 89        
 90     }
 91 }
 92 int main()
 93 {
 94      int t;
 95      scanf("%d",&t);
 96      while(t--)
 97      {
 98         scanf("%d",&n);
 99         tol=0;
100         int  weight;
101         for(int i=1;i<=n;i++)
102           for(int j=1;j<=n;j++)
103            {
104                 scanf("%d",&weight);
105                 if(j<=i) continue;
106                 if(weight==0 ) continue;
107                 addedge(i,j,weight);
108            }
109          sort(edge,edge+tol,cmp1);
110            
111          Kruskal();
112 
113          if(cnt!=n-1)
114               cout<<"-1"<<endl;
115            else
116               {
117                   sort(ans,ans+cnt,cmp2);
118                   cout<<ans[0].from<<" "<<ans[0].to;
119                   for(int i=1;i<cnt;i++)
120                       cout<<" "<<ans[i].from<<" "<<ans[i].to;
121                       cout<<endl;
122               }
123      }
124      return 0;
125 }

 

posted on 2013-10-01 16:40  GyyZyp  阅读(134)  评论(0编辑  收藏  举报

导航