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;
}