
并查集
syyyyyw
acmer一枚
展开
-
poj 2492
思路差不多,但要去判断同性恋自己手写在Union()写错了注意格式r[fx]=(r[x]+1+r[y])%2; //fx与x关系 + x与y的关系 + y与fy的关系 = fx与fy的关系这种叫种类并查集;#include#include#include#includeusing namespace std;const int maxn=2005;int p[max原创 2017-08-18 08:54:39 · 233 阅读 · 0 评论 -
Codeforces Round #385 (Div. 2) C
思路如下:先找联通块没有特殊点的联通块加起来与在有特殊点中点最多的联通块 这样最多有c2n 即n*(n-1)/2;剩下的特殊联通块自己加边代码如下#include#include#include#include#includeusing namespace std;const int maxn=1005;vectorgroup[maxn];int f[maxn]原创 2017-08-05 21:59:25 · 181 阅读 · 0 评论 -
Codeforces Round #383 (Div. 1) B
就是01背包问题先用并查集再用01背包复杂度为nw代码如下#include#include#include#include#includeusing 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 · 192 阅读 · 0 评论 -
poj 2236
注意是FAIL,不是FALL因为这个错了好几次代码如下#include#include#include#includeusing 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 · 118 阅读 · 0 评论 -
poj 1182
经典的并查集,参考别人写出来的代码如下#include#include#include#includeusing 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 · 173 阅读 · 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 · 262 阅读 · 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 · 187 阅读 · 0 评论