P5836 [USACO19DEC]Milk Visits S
思路:只有两种状态,然后让你判断从A走到B能不能喝到喜欢的牛奶。
先思考:什么情况喝不到喜欢的牛奶?
情况是从A到B的所有路径上全部都是和他想喝的牛奶相反的牛奶。
即从A到B的所有牛奶都相同且相反。会给相连的奶牛,会给他们的颜色。
用并查集做。将颜色相同且相连的奶牛放到一个连通块儿里。如果查询的起点和终点在同一个连通块里,且颜色相反,则肯定喝不到想要的。
如果不在一个连通块里,说明要么颜色不同,要么不连通。不连通则中间肯定有其他颜色的,颜色不同则直接能喝到想要的牛奶。
就是这个逻辑。
不太好想。
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 1e5+1;
int f[N];
char a[N]; //a[i] 表示i奶牛的品种
void Init()
{
for(int i=1;i<N;i++) f[i] = i;
}
int find(int x)
{
if(x==f[x]) return x;
return f[x] = find(f[x]);
}
void Union(int a,int b)
{
a=find(a);
b=find(b);
f[a] = b; //f[b] = a?
}
int main()
{
int n,m;
Init();
cin>>n>>m;
scanf("%s",a+1); //for循环scanf("%c",&a[i])不行!为啥
for(int i=1;i<n;i++)
{
int x,y;
cin>>x>>y;
if(a[x]==a[y]) Union(x,y);
}
for(int i=1;i<=m;i++)
{
int x,y;
char c;
cin>>x>>y>>c;
if(find(x)==find(y)&&a[x]!=c) cout<<0;
else cout<<1;
}
}