#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; }
种类并查集 食物链
猜你喜欢
转载自blog.csdn.net/xutian_curry/article/details/80380177
今日推荐
周排行