![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并查集
syyyyyw
acmer一枚
展开
-
poj 2492
思路差不多,但要去判断同性恋 自己手写在Union()写错了 注意格式 r[fx]=(r[x]+1+r[y])%2; //fx与x关系 + x与y的关系 + y与fy的关系 = fx与fy的关系 这种叫种类并查集; #include #include #include #include using namespace std; const int maxn=2005; int p[max原创 2017-08-18 08:54:39 · 199 阅读 · 0 评论 -
Codeforces Round #385 (Div. 2) C
思路如下: 先找联通块 没有特殊点的联通块加起来与在有特殊点中点最多的联通块 这样最多有c2n 即n*(n-1)/2; 剩下的特殊联通块自己加边 代码如下 #include #include #include #include #include using namespace std; const int maxn=1005; vectorgroup[maxn]; int f[maxn]原创 2017-08-05 21:59:25 · 154 阅读 · 0 评论 -
Codeforces Round #383 (Div. 1) B
就是01背包问题 先用并查集再用01背包 复杂度为nw 代码如下 #include #include #include #include #include using namespace std; const int maxn=1005; int dp[maxn],w[maxn],b[maxn],f[maxn]; vectorgroup[maxn]; int Find(int x) {原创 2017-08-05 19:35:38 · 168 阅读 · 0 评论 -
poj 2236
注意是FAIL,不是FALL 因为这个错了好几次 代码如下 #include #include #include #include using namespace std; struct Node { int x,y; }a[1007]; int vis[1007],f[1007]; int Find(int x) { return x==f[x]?x:Find(f[x]);原创 2018-03-07 13:15:36 · 98 阅读 · 0 评论 -
poj 1182
经典的并查集,参考别人写出来的 代码如下 #include #include #include #include using namespace std; struct Node { int p; int r; //0为同类,1为被父亲吃,2为吃父亲; }a[50009]; int Find(int x) { if(x==a[x].p) return x; i原创 2018-03-08 11:59:34 · 140 阅读 · 0 评论 -
poj 1703
并查集的高级使用 加了一个r【】来判断与根节点的关系 find() 如果 a 和 b 的关系是 r1, b 和 c 的关系是 r2, 那么 a 和 c 的关系就是 (r1+r2)%2 Union() 联合时,使得 p[fx] = fy; 同时也要寻找 fx 与 fy 的关系。关系为:(r[x]+r[y]+1)%2代码如下 #include #include #incl原创 2017-08-18 08:19:01 · 238 阅读 · 0 评论 -
upc 5220 A Possible Tree
带权并查集 代码如下 #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> using namespace std; int t,n,c,x,y; long long val,r[100005]; int p[100005]; int f(int x)...原创 2018-08-27 10:34:05 · 156 阅读 · 0 评论