#include <stdio.h>
#include <iostream>
#include <stack>
#include <string>
#include <set>
#include <memory.h>
#include <math.h>
#include <algorithm>
#include <queue>
#include <unordered_set>
using namespace std;
int parent[50005], group[50005], N, K, cnt, d;
int FindParent( int i )
{
if( i == parent[i] )
{
return i;
}
int temp = FindParent( parent[i] );
group[i] = ( group[i] + group[parent[i]] )%3;
parent[i] = temp;
return temp;
}
void uni( int x, int y )
{
int pax = FindParent(x);
int pay = FindParent(y);
if( pax == pay )
{
if( d == 1 && group[x] != group[y] )
{
cnt++;
}
else if( d == 2 && group[x] == 1 && group[y] != 0 )
{
cnt ++;
}
else if( d == 2 && group[x] == 2 && group[y] != 1 )
{
cnt++;
}
else if( d == 2 && group[x] == 0 && group[y] != 2 )
{
cnt++;
}
}
else
{
parent[pax] = pay;
if( d == 1 )
{
group[pax] = ( group[y] - group[x] + 3 ) % 3;
}
else
{
group[pax] = (group[y] - group[x] + 4 ) % 3;
}
}
return ;
}
int main()
{
scanf("%d %d", &N, &K);
for( int i = 1; i <= N; i++ )
{
parent[i] = i;
group[i] = 0;
}
cnt = 0;
while( K-- )
{
int x,y;
scanf("%d %d %d", &d, &x, &y);
if( x > N || y > N || ( d == 2 && x == y ) )
{
cnt ++;
continue;
}
uni(x, y);
}
printf("%d\n", cnt);
return 0;
}
种类并查集 食物链
最新推荐文章于 2022-06-23 11:46:34 发布