【模板】最小生成树
来源:互联网 发布:网络精灵pipopa中文版 编辑:程序博客网 时间:2024/06/03 17:23
kruskal:
#include<cstdio>#include<algorithm>using namespace std;int n,m,MST,num_edge,father[5001],head[5001];bool b[5001];struct Krus{ int from,to,dis;};Krus krus[200001];struct EDGE{ int next,to;}edge[200001];void add_edge(int from,int to){ edge[++num_edge].next=head[from]; edge[num_edge].to=to; head[from]=num_edge;}int find(int x){ if (father[x]!=x) return father[x]=find(father[x]); else return father[x];}int unionn(int x,int y){ int xx=find(x); int yy=find(y); if (xx!=yy) father[xx]=yy;}bool comp(Krus x,Krus y){ return x.dis<y.dis;}int tot;void dfs(int x){ if (b[x]) return; b[x]=true; tot++; for (int i=head[x]; i!=0; i=edge[i].next) dfs(edge[i].to);}int main(){ scanf("%d%d",&n,&m); for (int i=1; i<=n; i++) father[i]=i; for (int i=1; i<=m; i++) { scanf("%d%d%d",&krus[i].from,&krus[i].to,&krus[i].dis); add_edge(krus[i].from,krus[i].to); } dfs(1); if (tot<n) {printf("orz"); return 0;} sort(krus+1,krus+1+m,comp); int k=0; for (int i=1; i<=m; i++) if (find(krus[i].from)!=find(krus[i].to)) { k++; MST+=krus[i].dis; unionn(krus[i].from,krus[i].to);// if (k==n-1) break; } printf("%d",MST); return 0;}/*4 51 2 21 3 21 4 32 3 43 4 37*/
阅读全文
0 0
- 最小生成树模板
- 最小生成树模板
- 最小生成树---模板
- 最小生成树模板
- 最小生成树 模板
- 最小生成树(模板)
- 最小生成树模板
- 最小生成树模板
- 最小生成树模板
- 最小生成树【模板】
- 最小生成树【模板】
- 最小生成树模板
- 最小生成树模板
- 最小生成树 模板
- 最小生成树模板.
- 最小生成树模板
- 【模板】最小生成树
- 最小生成树模板
- python2.7——GSI-16格式水准数据平差
- mybatis batch insert
- 360度的吸引,iFunk双子变形本
- 自定义圆形,可根据鼠标移动,按下移动抬起事件
- MySQL5.6免安装版环境配置
- 【模板】最小生成树
- html 空格
- 关于C语言的问题
- Visual Studio 2017离线安装包获取和安装教程
- servlet/filter/listener/interceptor区别与联系
- Qt string与QString之间的转换
- CentOS 7系统时间与实际时间差8个小时
- 【模板】并查集
- poj 2965 dfs+枚举