kruskal-边的贪心(并查集优化)-3
来源:互联网 发布:珍珠控台软件 编辑:程序博客网 时间:2024/06/05 17:12
#include<bits/stdc++.h>using namespace std;const int N=1e4;int f[N+100],siz[N+100];int c[N+100];struct node{int u,v,w;}edge[N*20];bool cmp(node p,node q){return p.w<q.w;}void init(int n){for(int i=0;i<=n;i++) {f[i]=i;siz[i]=1;}}int found(int x){ while(x!=f[x]) { f[x]=f[f[x]]; x=f[x]; } return x;}void Union(int x,int y){ int tx=found(x); int ty=found(y); if(tx==ty) return; if(siz[tx]>siz[ty]){f[ty]=tx;siz[tx]+=siz[ty];} else {f[tx]=ty;siz[ty]+=siz[tx];}}int main(){ int n,m; scanf("%d%d",&n,&m); for(int i=0;i<m;i++) scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].w); int cn=0; for(int i=1,j=m;i<=n;i++) { scanf("%d",&c[i]); if(c[i]!=-1) { edge[j].u=0,edge[j].v=i,edge[j++].w=c[i]; cn++; } } sort(edge,edge+m+cn,cmp); init(n); int cost=0,flag=0,pcost; for(int i=0;i<m+cn;i++) { int x=edge[i].u,y=edge[i].v; int tx=found(x),ty=found(y); if(edge[i].w<=0||tx!=ty) { Union(x,y); if(x==0) { flag++; if(flag==1){pcost=edge[i].w;} } cost+=edge[i].w; } } if(flag==1) cost-=pcost; int flag1=1; for(int i=0;i<=n;i++) if(siz[i]>=n){flag1=0;break;} if(flag1){printf("-1\n");return 0;} printf("%d\n",cost); return 0;}
0 0
- kruskal-边的贪心(并查集优化)-3
- wikioi1069关押罪犯(贪心+并查集 kruskal算法)
- hdu1223(贪心+并查集=kruskal算法)
- 自来水管道 (并查集+贪心==kruskal)
- Kruskal算法:贪心+并查集=最小生成树
- hdu 1598 并查集+贪心---其实就是kruskal的思想
- kruskal+ 并查集
- Kruskal+并查集
- Kruskal + 并查集
- poj 1456 贪心+并查集优化
- Kruskal+并查集:John的农场
- Kruskal算法的并查集实现
- 并查集及其简单应用:优化kruskal算法
- 最小生成树---kruskal模板(并查集优化)
- Kruskal算法 (并查集)
- poj3522 并查集+kruskal
- hdu1233 并查集+Kruskal
- hdu3367并查集+Kruskal
- git版本库创建三部曲(git权威指南笔记)
- 计算字符串中某一个字符的个数
- SpringMVC 对多视图的支持
- H.264编码原理I/B/P帧
- CalendarListview中自定义属性的翻译
- kruskal-边的贪心(并查集优化)-3
- RelativeLayout或FrameLayout点击事件穿透
- php环境配置基础版
- openvpn中server.conf和client.conf配置文件详解
- 代码可读性提升指南
- 前N位数字能被N整除
- struts2的漏洞
- 虚函数内存模型
- java I/O 输入输出流