题目链接:
https://www.acwing.com/problem/content/242/
一句话总结:用每一个点到根结点的距离来表示吃的关系
余1表示可以根结点,余2表示可以被根结点吃,余0表示和根结点同类
根结点可以看成到自己的距离余0
Acwing编译器的oj感觉有bug
//用带权并查集的做法
#include <iostream>
using namespace std;
const int N = 50010;
int n,k;
int f[N];
int d[N];
int find(int x)
{
if (f[x] != x)
{
int t = find(f[x]);
d[x] += d[f[x]];
f[x] = t;
}
return f[x];
}
int main(){
cin>> n>>k;
int res =0 ;
for(int i =1;i<=N;i++) f[i] = i;
for(int i = 0;i<k;i++)
{
int t, x, y;
scanf("%d%d%d", &t, &x, &y);
if (x > n || y > n) res ++ ;
else
{
int fx = find(x), fy = find(y);
if (t == 1)
{
if (fx == fy && (d[x] - d[y]) % 3) res ++ ;
else if (fx != fy)
{
f[fx] = fy;
d[fx] = d[y] - d[x];
}
}
else
{
if (fx == fy && (d[x] - d[y] - 1) % 3) res ++ ;
else if (fx != fy)
{
f[fx] = fy;
d[fx] = d[y] + 1 - d[x];
}
}
}
}
cout<<res<<endl;
return 0;
}
京公网安备 11010502036488号