HDU 3367 Pseudoforest(最大生成树+并查集)
2016-04-15 20:14
441 查看
大意:n个点m条边,问如果每个联通分支中最多有一个环,最后可以组成的最大的权值和是多少。
思路:类似一颗生成树,是的话那么一定是最大生成树。那么怎么判断是不是会有环的形成呢?那么就可以用并查集判断了,所以直接用克鲁斯卡尔算法算最大生成树即可。
概括起来有两种情况:1、两个端点在同一集合,那么判断是不是有环(标记数组判定),2.不在同一集合,如果两边都有环也不可以。
思路:类似一颗生成树,是的话那么一定是最大生成树。那么怎么判断是不是会有环的形成呢?那么就可以用并查集判断了,所以直接用克鲁斯卡尔算法算最大生成树即可。
概括起来有两种情况:1、两个端点在同一集合,那么判断是不是有环(标记数组判定),2.不在同一集合,如果两边都有环也不可以。
#include<map> #include<cmath> #include<queue> #include<cmath> #include<string> #include<cstdio> #include<stack> #include<iostream> #include<cstring> #include<algorithm> #define inf 0x3f3f3f3f #define eps 1e-8 #define ls l,mid,rt<<1 #define rs mid+1,rt,rt<<1|1 #define LL __long long 64 #define ll long long #include<cmath> #include<set> #define mod 997 using namespace std; struct node{ int u,v,w; bool operator < (const node &b)const { return w > b.w; } }q[1000000]; __int64 cnt; int father[1000000]; bool vis[100000]; int fi(int r){ return r == father[r]? r: father[r] = fi(father[r]); } void mer(int a,int b,int c){ int x = fi(a); int y = fi(b); if(x != y){ if(!vis[x]&&!vis[y]){ father[x] = y; cnt += c; } else if(!vis[x]||!vis[y]){//注意不要写成vis[x]||vis[y] father[x] = y; cnt += c; vis[x] = vis[y] = true; } } else{ if(!vis[x]&&!vis[y]){ cnt += c; vis[x] = vis[y] = true; } } } int main(){ int n,m,k,i,j,a,b,c; while(~scanf("%d%d",&n,&m)){ if(!n&&!m) break;cnt = 0; memset(vis,false,sizeof(vis)); for(i = 0;i < m;++ i){ scanf("%d%d%d",&a,&b,&c); q[i].u = a,q[i].v = b;q[i].w = c; } sort(q,q+m); for(i = 0;i < n;++ i){ father[i] = i; } for(i = 0;i < m ;++ i){ mer(q[i].u,q[i].v,q[i].w); } printf("%I64d\n",cnt); } return 0; }
相关文章推荐
- PHP超牛逼无限极分类生成树方法
- 生成树配置
- 详解生成树协议STP/RSTP
- STP/RSTP/MSTP经典分析与对比
- 1611:The Suspects
- HDU-1213-How Many Tables
- Longest Consecutive Sequence,Distinct Subsequences,Interleaving String,Scramble String
- 并查集_POJ 1182_食物链
- SARS病毒传染 并查集
- HDU 1213
- CSU1307 并查集+SPFA
- BestWiring——Kruskal算法&并查集
- 1611:The Suspects
- 并查集示例1
- 并查集(union-find)学习报告
- bzoj1016
- poj3728
- HDU-1233 还是畅通工程(最小生成树&并查集)
- Simon-【深入理解数据结构】有根树的不同实现① —— 并查集
- STP生成树的选举过程。