poj
這裡採用並查集的補集。
$x$表示同類集合,$x+n$表示敵人集合,$x+n\times2$表示敵人的敵人集合。
如果當前給出的是一對同類關係,就判斷$x$是否吃$y$或者$y$是否吃$x$(衝突)。上面這對話可能有點繞口,但是大概還是講出來了,仔細理解一下吧...如果是真話,就將所有關係連在一起。
反之,如果給出的是一對$x$吃$y$關係,就判斷$x$是否吃了自己(矛盾)或者他們兩個互相吃(衝突)。
如果是真話,將$x$的敵人和$y$的敵人的敵人(朋友)連在一起,將$y$的敵人和$x$的敵人的敵人(朋友)連在一起,即$y$的敵人是$x$的朋友,將$y$丟進$x$的敵人集合中。
這裡還有乙個帶權並查集的做法,但是並查集補集更好寫(寫起來更順些)。
#include #include #define rg register
const int n = 5e4 + 10;
int n, k, fa[n * 3], cz, x, y, ans, nn;
int find (int x)
int unionn (int u, int v) //v -> u
int main () //依據2
if (cz == 1) //依據1
unionn (x, y); unionn (x + n, y + n); unionn (x + (n << 1), y + (n << 1));
} else //依據1&依據3
unionn (y + (n << 1), x); unionn (y, x + n); unionn (y + n, x + (n << 1));
} }printf ("%d\n", ans);
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...