洛谷 - P5836 [USACO19DEC]Milk Visits S (并查集+连通块或者LCA)
程序员文章站
2024-01-08 08:04:22
...
题目传送
题意:
思路:
1.那么他给定了n个点,n-1条边的无向图,又说了这个图是相互连通的,那么一个点到另外一个点的路径是唯一的。
2.既然路径是唯一的,那么我们就看路径的性质,如果这条路径上面又有G又有H,那么无论谁走这条路都会高兴的。而如果这条路上只有H或者G,那么当喜欢另一种口味的人,走这条路就会不高兴
3.所以找出其特性:给定俩个点,路径唯一,只有当这条路的字符一样的时候,才有可能使客人不高兴,而字符一样,那不就是具有相同的性质吗?用并查集将字符一样的边连通,后面再判断就是。
LCA我还不会。。。。
AC代码
#include <bits/stdc++.h>
inline long long read(){char c = getchar();long long x = 0,s = 1;
while(c < '0' || c > '9') {if(c == '-') s = -1;c = getchar();}
while(c >= '0' && c <= '9') {x = x*10 + c -'0';c = getchar();}
return x*s;}
using namespace std;
#define NewNode (TreeNode *)malloc(sizeof(TreeNode))
#define Mem(a,b) memset(a,b,sizeof(a))
#define lowbit(x) (x)&(-x)
const int N = 1e5 + 10;
const long long INFINF = 0x7f7f7f7f7f7f7f;
const int INF = 0x3f3f3f3f;
const double EPS = 1e-7;
const double EEE = exp(1);
const int mod = 1e9+7;
const double II = acos(-1);
const double PP = (II*1.0)/(180.00);
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<ll,ll> piil;
int f[N],ans[N];
char str[N];
int Find(int x)//并查集
{
if(x == f[x])
return x;
return f[x] = Find(f[x]);
}
signed main()
{
std::ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
// freopen("input.txt","r",stdin);
// freopen("output.txt","w",stdout);
int n,m;
cin >> n >> m;
for(int i = 1;i <= n;i++)
{
cin >> str[i];
f[i] = i;//初始化
}
for(int i = 1;i < n;i++)
{
int u,v;
cin >> u >> v;
if(str[u] == str[v])//如果字符一样,连通
f[Find(u)] = Find(v);
}
for(int i = 1;i <= m;i++)
{
int a,b;
char c;
cin >> a >> b >> c;
if(Find(a) == Find(b) && c != str[a]) ans[i] = 0;//只有当路径字符一样且所需的字符与路径不一样的时候才不高兴
else ans[i] = 1;
}
for(int i = 1;i <= m;i++)
cout << ans[i];
}