luogu P5836
有题解说是lca模板题,奈何本蒟蒻还未掌握lca,但是用并查集来做感觉非常巧妙
因为只有两种奶牛,可以看成两种颜色,把所有结点分成这两个点集。
之后列举起点与终点时,判断两点是否属于一个点集
- 如果不属于同一个点集
则两点之间路径必然两种都有 - 如果属于同一个点集
则只有一种颜色,那只需比较一下偏好颜色是否是该点集的颜色
#include<bits/stdc++.h>
using namespace std;
char s[100005];
int fa[100005];
int fin(int x)
{
if(x==fa[x])
return x;
else return fa[x]=fin(fa[x]);
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
scanf("%s",s+1);
for(int i=1; i<=n; i++) fa[i]=i;
for(int i=1; i<=n-1; i++)
{
int u,v;
scanf("%d%d",&u,&v);
if(s[u]==s[v])
{
fa[v]=u;
}
}
for(int i=1; i<=m; i++)
{
int u,v;
char ch;
scanf("%d%d %c",&u,&v,&ch);
int aa=fin(u),bb=fin(v);
if(aa!=bb)
printf("1");
else
{
if(s[u]==ch)
printf("1");
else printf("0");
}
}
return 0;
}