種類並查集是我自己分的類,下面是幾道相關的題,都要求分類。
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個罪犯,兩個幫派,已知其中若干對兩者屬...