Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
怎么会WA呢,哪位好心人帮俺看看#include<stdio.h> #include<set> #include<algorithm> using namespace std; struct Edge{ int u,v,w; } ; class UFset{ int *rank; int *parent; int n; public: UFset(int n){ int i; this->n=n; rank=new int[n + 1]; parent=new int [n + 1]; for(i=0;i<=n;++i){//从1开始,表示从节点1开始 parent[i]=-1; rank[i]=1; } } ~UFset(){ delete []parent; delete []rank; } int Find(int e){ int i=e; while(parent[i]!=-1) i=parent[i]; int j=e; while(j!=i){ int pj=parent[j]; parent[j]=i; j=pj; } return i; } void Union(int a,int b){ if(a==b) return; if(rank[a]>rank[b]) parent[b]=a; else parent[a]=b; if(rank[a]==rank[b]) rank[b]++; } }; class Graph{ public: int n,m; Edge edge[130000]; void kruskal(); }; bool cmp(const Edge& e1,const Edge& e2){ return e1.w<e2.w; } void Graph::kruskal(){ sort(edge+1,edge+m+1,cmp); UFset ufset(n); int min=0; int k=1; int count=1; for(int i=1;i<=m;++i){ int p1=ufset.Find(edge[i].u); int p2=ufset.Find(edge[i].v); if(p1!=p2){ ufset.Union(p1,p2); ++k; ++count; } if(k==n) break; } printf("%d\n",edge[count-1].w); } Graph g; int G[501][501]; int main(){ int t,i,j,N; scanf("%d",&t); while(t--){ scanf("%d",&N); for(i=1;i<=N;++i) for(j=1;j<=N;++j){ scanf("%d",&G[i][j]); } g.n=N; int m=1; for(int j=0;j<13000;++j) g.edge[j].w=(1<<15); for(i=2;i<=N;++i) for(j=1;j<i;++j){ g.edge[m].w=G[i][j]; g.edge[m].u=i; g.edge[m].v=j; m++; } g.m=m-1; g.kruskal(); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator