hdu1863 kruskal(最小生成树)
2013-08-17 16:42
295 查看
#include<iostream> #include<algorithm> #include<cstdio> using namespace std; const int NM=110; int parent[NM]; int N,M; struct Edge { int u; int v; int w; }edge[NM]; bool cmp(Edge a,Edge b) { return a.w<b.w; } void init() { for(int i=1;i<=M;i++) parent[i]=i; } int find(int x) { if(x!=parent[x]) return find(parent[x]); return x; } void Union(int x,int y) { int xx=find(x); int yy=find(y); if(xx!=yy) { parent[xx]=yy; } } int kruskal() { int sum=0,uu,vv,up,vp,count=0; sort(edge,edge+N,cmp); //cout<<"M="<<M<<endl; for(int i=0;i<N;i++) { uu=find(edge[i].u); vv=find(edge[i].v); // cout<<"uu="<<uu<<" "<<"vv="<<vv<<endl; if(uu!=vv) { Union(uu,vv); count++; sum+=edge[i].w; } if(count>=M-1) break; } // cout<<"count="<<count<<endl; if(count>=M-1) return sum; else return -1; } int main() { int s; while(cin>>N>>M&&N) { init(); for(int i=0;i<N;i++) { scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].w); } s=kruskal(); if(s==-1) printf("?\n"); else printf("%d\n",s); } system("pause"); return 0; }
相关文章推荐
- hdu 1863 畅通工程 最小生成树模板入门题 prim+kruskal两种算法AC。
- HDU - 1863[畅通工程] 最小生成树Kruskal
- hdu 1863 畅通工程(最小生成树,kruskal)
- HDU 1863 畅通工程 (最小生成树Kruskal)
- 【最小生成树+kruskal】杭电 hdu 1863 畅通工程
- HDU - 1863 畅通工程(最小生成树kruskal)
- hdu 1863 kruskal 最小生成树
- hdu 1863 最小生成树+并查集 (Kruskal)
- hdu 1863(最小生成树kruskal)
- HDU 1863 畅通工程(最小生成树 kruskal)
- hdu-1863畅通工程 最小生成树克鲁斯卡尔算法kruskal(并查集实现)&&prim普利姆算法实现
- hdu 1863 畅通工程 (最小生成树kruskal 算法)
- HDU 1863 畅通工程(最小生成树-Kruskal)
- HDU 1863畅通工程(最小生成树)(prim算法)
- hdu 1879 继续畅通工程 最小生成树kruskal
- hdu 1863 最小生成树
- 畅通工程(最小生成树)【HDU】-1863
- HDU 1863 畅通工程 prim算法 最小生成树
- HDU 1879 继续畅通工程(最小生成树-Kruskal)
- HDU 1233 还是畅通工程 (最小生成树 Kruskal)