poj 1182 食物鏈 帶權並查集

2021-07-11 21:11:25 字數 922 閱讀 8608

題意:題目告訴有3種動物,互相吃與被吃,現在告訴你m句話,其中有真有假,叫你判斷假的個數(如果前面沒有與當前話衝突的,即認為其為真話)。

經典的並查集題目,可以設定權值r[i](i與父親節點的關係):

0——同類;

1——食物;

2——天敵。

再用由i的關係r[i],父親的關係r[pre[i]],推出i與爺爺的關係r[i]=(r[pre[i]]+r[i])%3,這個公式可用來路徑壓縮。

又由兒子到父親的關係r[i]可以推出父親到兒子的關係3-r[i]。

同樣,合併兩個集合時也需要建立兩個根節點的關係,假設x的根節點為x1,y的根節點為x2,如果x1!=x2,將x2做為x1的根,更新:

pre[x1]=x2;

r[x1]=(3-r[x]+d+r[y])%3;//三個量分別為從x1到x,再從x到y,再從y到x2的關係

這個公式和上面的公式異曲同工。

//#include#include#include#include#include#define n 55000

using namespace std;

int pre[n],r[n],n,k,ans;

int finds(int v)

void unions(int d,int x,int y)

int x1=finds(x);

int x2=finds(y);

if(x1==x2)

pre[x1]=x2;

r[x1]=(3-r[x]+d+r[y])%3;//三個量分別為從x1到x,再從x到y,再從y到x2的關係

}int main()

{ scanf("%d%d",&n,&k);

for(int i=0;i<=n;i++) pre[i]=i,r[i]=0;

ans=0;

for(int i=0;i

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...