题解: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;
}
posted @ 2024-11-23 16:07  KukCair  阅读(21)  评论(0)    收藏  举报