食物鏈(種類並查集)


題目鏈接

 

這里給出三種生物的關系,吃與同類的關系。由於這三種生物的關系依舊可以形成一個環,A吃B,B吃C,C又吃A。所以可以套種類並查集模版。 

題解:鏈接

這里求的x->y的偏移量,即把x當父節點,y當子節點時,
y的relation,x吃y,則y就被x吃,所以y的relation為1=d-1

代碼 


這里寫圖片描述

 

#include<iostream>
using namespace std;

const int maxn = 100000 + 10;

int pre[maxn];
int r[maxn]; // 父節點,與父節點的關系。0代表同類,1代表吃父節點,2代表被父節點吃。

int find(int x){
    int fx = pre[x];
    if(pre[x] != x){
        pre[x] = find(pre[x]);
        //更新關系
        r[x] = (r[x] + r[fx]) % 3;

     }
     return pre[x];
}

int main(){

int n,t,ans;
cin >> n >> t;
for(int i = 0; i<= n; i++){
pre[i] = i;
r[i] = 0;

}

ans = 0;
while(t--){
    int x,y,d;
    cin >> d >> x >> y;
    int fx = find(x);
    int fy = find(y);
    if(x > n || y > n || (d == 2 && x == y))
        ans++;
    // 這里求的x-&gt;y的偏移量,即把x當父節點,y當子節點時,
    //y的relation,x吃y,則y就被x吃,所以y的relation為1=d-1
    else if(fx == fy && (r[x] - r[y] + 3) % 3 != d - 1)
        ans++;
    else if(fx != fy){
        pre[fx] = fy;
        //合並后轉移偏轉量
        r[fx] = ((d - 1) + r[y] - r[x] + 3) % 3 ;
    }
 }

cout << ans << endl;



return 0;
    }
//    return 0;

 

 

還有一種對種類並查集的理解(此方法暫補)先上題解+標程

題解

#include <cstdio>

inline int read() {
    char c = getchar(); int n = 0;
    while (c < '0' || c > '9') { c = getchar(); }
    while (c >= '0' && c <= '9') { n = (n << 1) + (n << 3) + (c & 15); c = getchar(); }
    return n;
}

const int maxN = 100005;

int n, m, ans, fa[maxN * 3];

int find(int u) { return fa[u] == u ? u : fa[u] = find(fa[u]); }

int main() {
    n = read(), m = read();
    for (int i = 1; i <= n * 3; i++) { fa[i] = i; }
    for (; m; m--) {
        int opt = read(), u = read(), v = read();
        if (u > n || v > n) { ans++; continue; }
        if (opt == 1) {
            if (find(u + n) == find(v) || find(u) == find(v + n)) { ans++; }
            else {
                fa[find(u)] = find(v);
                fa[find(u + n)] = find(v + n);
                fa[find(u + n + n)] = find(v + n + n);
            }
        } else {
            if (find(u) == find(v) || find(u) == find(v + n)) { ans++; }
            else {
                fa[find(u + n)] = find(v);
                fa[find(u + n + n)] = find(v + n);
                fa[find(u)] = find(v + n + n);
            }
        }
    }
    printf("%d\n", ans);
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM