HDU 1863 畅通工程(kruskal)
2015-08-19 19:56
489 查看
题目大意:
中文题,是一个求最小生成树的模板题,需要判是否连通。
解题思路:
都说了是模板题,写个kruskal模板就能过,所有的点都操作过即说明这个图一定连通。
中文题,是一个求最小生成树的模板题,需要判是否连通。
解题思路:
都说了是模板题,写个kruskal模板就能过,所有的点都操作过即说明这个图一定连通。
#include<cstdio> #include<cstring> #include<string> #include<cmath> #include<iostream> #include<set> #define LL long long #define db double #define maxn 10000000 #define EPS 1e-15 #define max(a,b) ((a>b)?(a):(b)) #define min(a,b) ((a<b)?(a):(b)) using namespace std; int p[110],m,n,sum; struct Fuck{ int u,v,w; }fuck[110],tmp; int find(int x){ return x==p[x]?p[x]:find(p[x]); } void qsort(int l,int r){ int ll,rr,mid; ll=l; rr=r; mid=(fuck[ll].w+fuck[rr].w)>>1; while (ll<=rr){ while (fuck[ll].w<=mid) ll++; while (fuck[rr].w>=mid) rr--; if (ll<=rr){ tmp=fuck[ll]; fuck[ll]=fuck[rr]; fuck[rr]=tmp; } } if (l<rr) qsort(l,rr); if (r<ll) qsort(r,ll); } void Kruskal(){ int i,ans=0; for(i=1;i<=m;i++) p[i]=i; qsort(1,n); for(i=1;i<=n;i++){ int x=find(fuck[i].u); int y=find(fuck[i].v); if(x!=y){ sum++; ans+=fuck[i].w; p[x]=y; } } if(sum==m) printf("%d\n",ans); else printf("?\n"); } int main(){ while(1){ scanf("%d%d",&n,&m); if (n==0) break; int i; sum=1; for(i=1;i<=n;i++) scanf("%d%d%d",&fuck[i].u,&fuck[i].v,&fuck[i].w); Kruskal(); } return 0; }
相关文章推荐
- 使用活动条ActionBar
- unity中鼠标拖拽物体移动
- android中的Activity和Intent
- unity3d 学习笔记_____Native2d 刚体、冲击、联合使用
- 数据持久化(归档和反归档操作 ,清除缓存等等)
- 基于深度优先算法的有向图环路检测
- Android之玩转选项卡(TabHost、TabWidget、FrameLayout)
- 全面理解Unity加载和内存管理
- HDOJ 1337 The Drunk Jailer(水题)
- Activity的操作—去标题和横竖屏
- [BLE--Link Layer]物理信道
- s3c2440串口编程
- JavaWeb前端学习网站
- 【机房收费系统】——总结
- queue队列容器
- 线段树II--区间修改
- 一些写的不错的博文,记下来,以后可以再看看
- HDU 2544 最短路(dijkstra)
- 题目:颠倒整数
- JDBC简介(2)