题解:SP1442 CHAIN - Strange Food Chain
有三种可能的假话:编号 \(> n\);自己吃自己;互吃。
使用扩展域并查集(种类并查集)。
code:
#include <bits/stdc++.h>
using namespace std;
int n, m, c, t, F[150005];
int find(int x){
if(F[x] == x) return x;
return F[x] = find(F[x]);
}
int main(){
cin >> t;
while(t--){
cin >> n >> m;
c = 0;
for(int i = 1; i <= n * 3; i++) F[i] = i;
/* 要开 3 倍,因为要存同类、天敌、食物 */
for(int i = 1; i <= m; i++){
int o, p, q;
cin >> o >> p >> q;
if(p > n || q > n){ // 编号 > n
c++;
continue;
}
if(o == 1){
if(find(p) == find(q + n) || find(p) == find(q + n * 2)){ // 自己吃自己
c++;
continue;
}
F[find(p)] = find(q);
F[find(p + n)] = find(q + n);
F[find(p + n * 2)] = find(q + n * 2);
}
else{
if(find(p) == find(q) || find(p) == find(q + n * 2)){ // 互吃
c++;
continue;
}
F[find(p)] = find(q + n);
F[find(p + n)] = find(q + n * 2);
F[find(p + n * 2)] = find(q);
}
}
cout << c << '\n';
}
return 0;
}
本文来自博客园,作者:KukCair,转载请注明原文链接:https://www.cnblogs.com/KukCair/p/18564677

浙公网安备 33010602011771号