種類並查集

2021-10-02 15:56:52 字數 1640 閱讀 9408

種類並查集是我自己分的類,下面是幾道相關的題,都要求分類。 

a bug's life

核心思想:

不難發現,一旦我們有了兩個bug之間的關係,我們一定可以判斷出它們的性別異同,甚至可以相互推斷,比如 a 與 b 能**,b 與 c 能**,那麼就能推出 a,c 與 b 性別相反,我們把這三個成為已經建立了關係的bug,現在將建立關係的插到同一棵樹上,關係不確定的不插進去。在這棵樹上,與根節點的距離mod2為0的表示與根節點的bug同性,mod2為1表示異性。因此我們只需要維護乙個距離陣列就可以了。

#include #include #include #define n 2010

using namespace std;

int kase, n, m;

int f[n], d[n]; // d陣列用來存到根節點的距離

int fa, fb, a, b;

int find(int a)

return f[a];

}inline void merge(int a, int b)

int main()

printf("scenario #%d:\n", k);

while(m --)

if(flag)

puts("no suspicious bugs found!");

else puts("suspicious bugs found!");

puts(""); // 題目沒有明確說,但是卻要求在每個情景之後輸出空行

}return 0;

}

食物鏈

這道題也是一樣的道理,把已經建立關係的放在一棵樹上,與根節點距離mod2為0,1,2分別表示同類,吃根節點,被根節點吃

#include #include #include #include #include #define n 50010

using namespace std;

int f[n], d[n];

int n, k;

int find(int x)

return f[x];

}int main()

while(k --)

int fa = find(a), fb = find(b);

if(ff == 1)

else

}else

else}}

cout << res << endl;

return 0;

}

2. find them, catch them

#include #include #include #define n 100010

using namespace std;

int kase, n, m;

int f[n], d[n];

int fa, fb, a, b;

char ch[2];

int find(int a)

return f[a];

}inline void merge(int a, int b)

int main()

while(m --)

else}}

}return 0;

}

種類並查集

先來經典題目poj 1182 其實我現在都不是很明白這個題是怎麼做的 這道題貌似是並查集和向量做的,其中的關係推斷現在不是很明白。只知道和根節點的關係有三種,一種是同類 rank x 0 一種是被根節點吃掉 rank x 1 一種是吃掉根基點 rank x 2 如果不是很明白這道題的話可以跳過這道題...

種類並查集

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

種類並查集

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