⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1182.txt

📁 北大ACM题目例程 详细的解答过程 程序实现 算法分析
💻 TXT
字号:

#include <stdio.h>
#include <memory.h>

int s[50011];
int enemy[50011], food[50011];

int st[50011], sn;

int find( int k )
{
	int t = k;
	sn = 0;
	while( s[ k ] > 0 )
	{
		st[ sn++ ] = k;
		k = s[k];
	}
	
	while( sn-- )
		s[ st[sn] ] = k;



	return k;
}

int merge( int a, int b )
{
	int t;
	if( a != b && a && b )
	{
		if( s[a] > s[b] )
		{	t = a;	a = b;	b = t; }

		s[a] += s[b];
		s[b] = a;
	}
	return (a==0)?b:a;
}

int main()
{
	int n, m, i, j, d, k, h, ans, a, b, c;

	scanf( "%d %d", &n, &m);

	memset( s, -1, sizeof( int ) * ( n+1 ) );
	memset( enemy, 0, sizeof( int ) * ( n+1 ) );
	memset( food, 0, sizeof( int ) * ( n+1 ) );


	ans = 0;
	while( m-- )
	{

		scanf( "%d %d %d", &d, &i, &j );
		
		if( i > n || j > n || i == j && d == 2 )
		{	ans++; continue; }

		i = find( i );
		j = find( j );

		if( d == 1 )
		{
			if( ( k = find( enemy[i] ) ) && k == j || ( h = find( enemy[j] ) ) && h == i )
			{	ans++; continue; }
			else 
			{
				a = merge( i, j );
				food[i] = food[j] = b = merge( find( food[i] ), find( food[j] ) );
				enemy[i] = enemy[j] = c = merge( k, h );
			}
		}
		else
		{
			if( i == j || ( k = find( enemy[i] ) ) && k == j )
			{	ans++; continue; }
			else
			{
				food[j] = enemy[i] = a = merge( k, find( food[j] ) );
				enemy[j] = b = merge( i, find( enemy[j] ) );
				food[i] = c = merge( find( food[i] ), j );
			}
		}
		
		if( a && c ) enemy[a] = c;
		if( b && a ) enemy[b] = a;
		if( c && b ) enemy[c] = b;

		if( a && b ) food[a] = b;
		if( c && a ) food[c] = a;
		if( b && c ) food[b] = c;
	}

	printf( "%d\n", ans );

	return 0;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -