CodeForces 699D—— Fix a Tree(并查集判断环)
来源:互联网 发布:如何成为一个网络作家 编辑:程序博客网 时间:2024/06/06 14:35
思路:首先,怎么用并查集判断时候有环?你在合并两个节点的时候,如果他们之前已经处在同一个连通分量里,那么把这两个节点合并的时候必定会产生环。
怎么建树?如果存在父节点指向自己的点,那么就把它作为这棵树的根。如果不存在,那么随便开一个环,把开环的节点作为根节点。
并查集的过程可以同时完成建树和查环的操作,如果合并这两个节点会形成环,那就开环后把一个节点指向根节点。如果不会,那就把他们合并。
#include <cmath>#include <cstring>#include <cstdio>#include <vector>#include <string>#include <algorithm>#include <string>#include <map>#include <set>using namespace std;#define MAXN 200010#define LEN 1000000#define INF 1e9+7#define MODE 1000000typedef long long ll;int par[MAXN];void init(int n){ for(int i=1;i<=n;i++){ par[i]=i; }}int find(int x){ if(par[x]==x) return x; else return par[x]=find(par[x]);}void unite(int x,int y){ x=find(x); y=find(y); if(x==y) return; else par[x]=y;}bool same(int x,int y){ return find(x)==find(y);}struct edge{ int u,v;};vector <edge> e;int main(){ int n; while(scanf("%d",&n)!=EOF) { init(n); int ans; int root=-1; for(int i=1;i<=n;i++) { edge temp; temp.u=i; scanf("%d",&temp.v); e.push_back(temp); if(temp.u==temp.v) root=i; } int res=0; for(int i=0;i<e.size();i++) { if(e[i].u!=root) { if(same(e[i].u,e[i].v)) { res++; if(root==-1) root=e[i].u; e[i].v=root; } else unite(e[i].u,e[i].v); } } printf("%d\n",res); for(int i=0;i<e.size();i++) { printf("%d",e[i].v); if(i!=e.size()-1) printf(" "); } printf("\n"); }}
1 0
- CodeForces 699D—— Fix a Tree(并查集判断环)
- Codeforces 699D. Fix a Tree【并查集+思维】
- Codeforces Round #363 (Div. 2) D. Fix a Tree —— 并查集
- Codeforces Round #363 (Div. 2) D. Fix a Tree(并查集)(判断圆环)
- 【并查集】【模拟】Codeforces 698B & 699D Fix a Tree
- (环问题并查集)Codeforces Round #363 D Fix a Tree
- CF 699D Fix a Tree 并查集
- CF#699 D. Fix a Tree (并查集)
- Codeforces Round #363 (Div. 2) D. Fix a Tree (并查集)
- Codeforces Round #363 (Div. 2)D. Fix a Tree(并查集)
- Codeforces Round #363 (Div. 2) Problem D - Fix a Tree(并查集 + 构造)
- Codeforces Round #363 D Fix a Tree(并查集)
- Codeforces Round #363 (Div. 2) D. Fix a Tree(并查集)
- Codeforces Round #363 (Div. 2)D. Fix a Tree并查集
- Codeforces Round #363 (Div. 2) D Fix a Tree(并查集)
- Codeforces 698C. Fix a Tree (并查集)
- Codeforces 698B Fix a Tree 并查集
- CodeForces 698B - Fix a Tree(并查集)
- 使用socket编程
- Java和Objective-C用 成员变量名字符串 给成员变量赋值
- 一个程序员给产品经理的话
- UVa 10935 Throwing cards away I(习题5-3)
- Codeforces #364(Div.2)C.They Are Everywhere【思维】
- CodeForces 699D—— Fix a Tree(并查集判断环)
- Android Service 学习总结 1
- iOS开发UI篇—程序启动原理和UIApplication
- HDU 5738 Eureka(map瞎搞)
- B - B
- Android性能调优利器StrictMode
- 模拟常见的字符操作函数
- 类的派生性
- http://blog.csdn.net/mindfloating/article/details/51534289