種類並查集

2021-06-18 12:43:07 字數 1634 閱讀 8757

先來經典題目poj 1182

其實我現在都不是很明白這個題是怎麼做的

這道題貌似是並查集和向量做的,其中的關係推斷現在不是很明白。

只知道和根節點的關係有三種,

一種是同類 rank[x]=0;

一種是被根節點吃掉 rank[x]=1;

一種是吃掉根基點 rank[x]=2;

如果不是很明白這道題的話可以跳過這道題看下面一道題,有助於理解這道題

下面附上大神的解釋

#include

#include #include #define max 50500

using namespace std;

int parent[max],rank[max];

int n,m,sum;

void init()

sum=0;

}int find(int x)

return parent[x];

}void union(int d,int a,int b)

parent[root_a]=root_b; //進行並查集的並

rank[root_a]=(rank[b]-rank[a]+2+d)%3; //兩個集合在並操作時,更新與根節點的關係

}void solve()

//簡單的判斷

union(d,a,b);

} printf("%d\n",sum);

}int main()

poj 1703(種類並查集只有兩種狀態)

剛剛吃飯的時候想了一下rank[root_a]=(rank[a]+rank[b]+1)%2;這個公式,覺得這樣解釋比較好理解

現在a和b和位元組根節點的關係只有四種

(1)0 0,表示a和b都與根節點相同,這樣他們根基點關係是不同

(2)0 1,表示a與根節點相同,b和根節點不同。那麼他們的根節點關係必定相同

(3)1 0,(2)相反,但是根節點關係必定相同

(4)1 1,表示a和b都與根節點不同,那麼他們根節點的關係也是不同

這樣不論如何我們都需要rank[a]+rank[b]+1,為了使其值為0或者1,則要%2;這就是賦值公式的推論。

//設定rank陣列來判斷是否是同意幫派

//rank[x]=0 表示與根節點是同意幫派

//rank[x]=1 表示與根基點不是同意幫派

#include #include #include #define max 100100

using namespace std;

int parent[max],rank[max];

int n,m;

void init()

}int find(int x)

return parent[x];

}void union(int a,int b)

void solve()

else

if(rank[a]==rank[b])

printf("in different gangs.\n");

} }}int main()

return 0;

}

種類並查集

食物鏈 poj 1182 動物王國中有三類動物a,b,c,這三類動物的食物鏈構成了有趣的環形。a吃b,b吃c,c吃a。現有n個動物,以1 n編號。每個動物都是a,b,c中的一種,但是我們並不知道它到底是哪一種。有人用兩種說法對這n個動物所構成的食物鏈關係進行描述 第一種說法是 1 x y 表示x和y...

種類並查集

種類並查集是我自己分的類,下面是幾道相關的題,都要求分類。a bug s life 核心思想 不難發現,一旦我們有了兩個bug之間的關係,我們一定可以判斷出它們的性別異同,甚至可以相互推斷,比如 a 與 b 能 b 與 c 能 那麼就能推出 a,c 與 b 性別相反,我們把這三個成為已經建立了關係的...

種類並查集

一般的並查集是維護屬於同一種類的元素,對於屬於不同種類的元素之間的關係沒有記錄。種類並查集就是同一集合中的元素是已經確定關係的 是否屬於同一種類 然後加乙個group陣列,記錄一下孩子和父親是否屬於同一種類,遞推稍稍改一下就可以了。poj1703 題目大意 有n個罪犯,兩個幫派,已知其中若干對兩者屬...