大牛題解:
合併: d-1是偏移量,ra->rb, ra作為rb的父親,注意方向【箭頭是把右邊合併到左邊】
向量的思想:
if(ra!=rb)不在乙個集合裡,合併 fa[rb]=ra,還需要更新r[rb],即與新的父節點(ra)的關係
r[rb] = ra->rb = ra->a+a->b+b->rb = r[a]+(d-1)-r[b];
fa[rb] = ra;
r[rb] = (r[a]+d-1-r[b]+3)%3;
if(ra==rb) 不需要合併了,判斷是否矛盾,依然是向量的偏移量思想
a->b = a->ra+ra->b = -r[a]+r[b];
判斷 -r[a]+r[b] 是否等於 d-1(偏移量)
if((r[b]-(d-1)+3)%3 != r[a]) ans++;
find操作,把資訊傳下來,路徑壓縮
向量思想: r表示根節點,t表示當前x的父節點,現在要實現r->x(把x壓縮到根節點)
那麼 r->x = r->t+t->x = r[t]+r[x]。 把這個值依次傳下來。
r[x] =(r[x]+r[t])%3;
#include
#include
#include
#include
using namespace std;
typedef long
long ll;
#define ms(a) memset(a,0,sizeof(a))
#define mp make_pair
#define pb push_back
const
int inf = 0x3f3f3f3f;
const ll infll = 0x3f3f3f3f3f3f3f3fll;
inline ll read()
while(ch>='0'&&ch<='9')
return x*f;
}///
//////
//////
//////
//////
//////
//////
//////
//////
//////
//////
//////
/////
const
int maxn = 5e4+10;
int fa[maxn],r[maxn];
int find(int x)
int main()
if(d==2 && a==b)
ra = find(a),rb = find(b);
if(ra == rb)
else
}cout << ans << endl;
return
0;}
poj 1182 食物鏈 帶權並查集
這個題需要將動物分成3種,每次以y 0為物件,吃他的x為1,需要注意的是下一次碰到x cha函式遞迴更新與x有關的物件 include include include includeusing namespace std define n 50005 int father n num n int c...
poj1182食物鏈 帶權並查集
基本思路 帶權並查集 簡單的理解就是將有關係的點合併到乙個集合,記錄每個點到集合根節點的權重 include include include define max 50010 using namespace std int par max 記錄集合根節點 int offset max 記錄每個節點到...
poj 1182 食物鏈 帶權並查集
食物鏈 time limit 1000ms memory limit 10000k total submissions 50713 accepted 14818 description 動物王國中有三類動物a,b,c,這三類動物的食物鏈構成了有趣的環形。a吃b,b吃c,c吃a。現有n個動物,以1 n...