zoj1542||poj 1861(简单-MST)

来源:互联网 发布:php paste 编辑:程序博客网 时间:2024/05/02 00:59

同上,手写Kruskal水过。special judge,样例是错的,,囧 = =

zoj 170留念



#include<iostream>#include<cstring>#include<cstdlib>#define MAXN 1005#define MAXM 15000using namespace std;typedef struct edge{int u,v,w;}edge;edge edges[MAXM];int parent[MAXN];int N,M;int cmp(void const *a,const void *b){edge aa=*(const edge *)a;edge bb=*(const edge *)b;return aa.w-bb.w;}void UFset(){for(int i=0;i<=N;i++)parent[i]=-1;}int Find(int x){int s;for(s=x;parent[s]>=0;s=parent[s]) ;while(s!=x){int tmp=parent[x];parent[x]=s;x=tmp;}return s;}void Union(int R1,int R2){int r1=Find(R1);int r2=Find(R2);int tmp=parent[r1]+parent[r2];if(parent[r1]>parent[r2]){parent[r1]=r2;parent[r2]=tmp;}else {parent[r1]=tmp;parent[r2]=r1;}}void Kruskal(){int num=0;int maxV=0;int i,k=0;int u,v;int order[MAXM];UFset();for(i=0;i<M;i++){u=edges[i].u;v=edges[i].v;if(Find(u)!=Find(v)){order[k++]=i;if(maxV<edges[i].w) maxV=edges[i].w;num++;Union(u,v);}if(num>=N-1) break;}cout<<maxV<<endl;cout<<num<<endl;for(i=0;i<num;i++){cout<<edges[order[i]].u<<" "<<edges[order[i]].v<<endl;}}int main(){int u,v,w;int i;while(cin>>N>>M){for(i=0;i<M;i++){cin>>u>>v>>w;edges[i].u=u;edges[i].v=v;edges[i].w=w;}qsort(edges,M,sizeof(edges[0]),cmp);Kruskal();}return 0;}




原创粉丝点击