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;
}

浙公网安备 33010602011771号