ZOJ 3204 Connect them 字典序输出最短路

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3367

关键按字典序输出。。。死了多少脑细胞啊!!!

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define nMAX 102
using namespace std;
int root[nMAX];
int n,s_edge,cnt;
struct Edge
{
    int u,v,w;
}edge[nMAX*nMAX],ans[nMAX*nMAX];
void addedge(int u,int v,int w)
{
    edge[s_edge].u=u;
    edge[s_edge].v=v;
    edge[s_edge].w=w;
    s_edge++;
}
//sort排序
//此处排u,v是因为,qsort,sort都是用的
//分治,w相等的时候u小的排到了后面所以。。。
bool cmp(Edge a,Edge b)
{
    if(a.w!=b.w)return a.w<b.w;
    else if(a.u!=b.u)return a.u<b.u;
    else return a.v<b.v;
}
bool cmp2(Edge a,Edge b)
{
    if(a.u!=b.u)return a.u<b.u;
    else return a.v<b.v;
}
int find(int x)
{
    if(x!=root[x])//if!!!
        root[x]=find(root[x]);
    return root[x];
}
void kruscal()
{
    int i,j,k;
    for(i=1;i<=n;i++)
        root[i]=i;
    cnt=0;
    for(k=0;k<s_edge;k++)
    {
        int a=find(edge[k].u),
            b=find(edge[k].v);
        if(a!=b)
        {
           ans[cnt++]=edge[k];
           root[a]=b;
        }
    }
}

int main()
{
    int CASE,i,j,k;
    scanf("%d",&CASE);
    while(CASE--)
    {
        scanf("%d",&n);
        s_edge=0;
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
            {
                scanf("%d",&k);
                if(k==0)continue;
                if(j>i)addedge(i,j,k);
            }
        sort(edge,edge+s_edge,cmp);
        kruscal();
        sort(ans,ans+cnt,cmp2);
        if(cnt!=n-1)printf("-1\n");
        else
        {
            printf("%d %d",ans[0].u,ans[0].v);
            for(i=1;i<cnt;i++)
                printf(" %d %d",ans[i].u,ans[i].v);
            printf("\n");
        }
    }
    return 0;
}

  

  

posted @ 2012-05-07 17:09  快乐.  阅读(158)  评论(0编辑  收藏  举报