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