luoguP5836 [USACO19DEC]Milk Visits S

题目是一颗生成树,所以路径唯一

树上只有两种颜色,如果客人在经过的路径上有自己喜欢的颜色,则输出 1,否则输出 0

可以用并查集来把相同的颜色合并起来。

\(a,b\) 颜色相同,\(col[a]!=c\) 路上全是客人不喜欢的颜色,输出 0

\(a,b\) 颜色相同,\(col[a]==c\) ,路上全是客人喜欢的颜色,输出 1

\(a,b\) 颜色不同,那么说明这条路肯定经过两种颜色,那么客人喜欢的颜色一定在其中,输出 1

并查集
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int fa[N],str[N*3],n,m;
char col[N];
int find(int x) {
    if(fa[x] != x) return fa[x] = find(fa[x]);
    return x;
}
void merge(int a,int b) {
    fa[find(a)] = find(b);
}
int main() {
    cin >> n >> m;
    for(int i = 1;i <= n; ++i) {
        fa[i] = i;
        cin >> col[i];
    }
    for(int i = 0;i < n - 1; ++i) {
        int a,b;cin >> a >> b;
        if(col[a] == col[b]) merge(a,b);
    }
    for(int i = 0;i < m; ++i) {
        int a,b;
        char c;
        cin >> a >> b >> c;
        if(find(a) == find(b) && col[a] != c) str[i] = 0;
        else str[i] = 1;
    }
    for(int i = 0;i < m; ++i) cout << str[i];
    return 0;
}
posted @ 2020-06-17 01:55  lukelmouse  阅读(64)  评论(0编辑  收藏  举报