zoukankan      html  css  js  c++  java
  • POJ 1182 食物链

    http://poj.org/problem?id=1182

    对于每只动物 i 创建3个元素,i-A, i-B, i-C,并用3 x N 个元素建立并查集,这个并查集维护如下信息:

    # i - x 表示 i 属于种类i;

    # 并查集里的每一组表示组内所有元素代表的情况都同时发生或不发生。

    第一种  x 和 y属于同种类, 合并 x-A和y-A, x-B和y-B, x-C和y-C;

    第二种 x 吃 y                          合并x-A和y-B,x-B和y-C, x-C和y-A;  

    代码

    #include <stdio.h>
    #include <stdlib.h>
    #include <string>
    #include <string.h>
    #include <map>
    using namespace std;
    #define MAX_N 50001*3
    #define MAX_K 100005
    int par[MAX_N], t[MAX_K], a[MAX_K], b[MAX_K], n, k;
    void init()
    {
    	for (int i = 0; i <= n * 3; i++)
    	{
    		par[i] = i;
    	}
    }
    int find(int x)
    {
    	int y = x;
    
    	while (y != par[y])
    	{
    		y = par[y];
    	}
    
    	while (x != par[x])
    	{
    		int px = par[x];
    		par[x] = y;
    		x = px;
    	}
    
    	return y;
    }
    void Union(int x, int y)
    {
    	int ra = find(x), rb = find(y);
    	par[ra] = rb;
    }
    void slove()
    {
    	int sum = 0, z, x, y;
    
    	for (int i = 0; i < k; i++)
    	{
    		z = t[i];
    		x = a[i];
    		y = b[i];
    
    		if (x < 1 || x > n || y < 1 || y > n)
    		{
    			sum++;
    			continue;
    		}
    
    		if (z == 1)
    		{
    			//x, y属于同一类
    			if (find(x) == find(y + n) || find(x) == find(y + 2 * n))
    			{
    				sum++;
    				continue;
    			}
    			else
    			{
    				Union(x, y);
    				Union(x + n, y + n);
    				Union(x + 2 * n, y + 2 * n);
    			}
    		}
    		else
    		{
    			//想吃y
    			if (find(x) == find(y) || find(x) == find(y + 2 * n))
    			{
    				sum++;
    				continue;
    			}
    			else
    			{
    				Union(x, y + n);
    				Union(x + n, y + 2 * n);
    				Union(x + 2 * n, y);
    			}
    		}
    	}
    
    	printf("%d
    ", sum);
    	return;
    }
    int main()
    {
    	//freopen("1.in","r",stdin);
    	int i;
    	scanf("%d %d",&n,&k);
    	init();
    	for (i = 0; i < k; i++)
    	{
    		scanf("%d %d %d", &t[i], &a[i], &b[i]);
    	}
    
    	slove();
    
    	system("pause");
    	return 0;
    }
    


    www.cnblogs.com/tenlee
  • 相关阅读:
    less @import and extend及mixin详解
    Less的guards and argument matching
    LESS嵌套中的Mixins和classes
    bootstrap colorscheme以及theme自动生成
    C# Winform 获得下拉框 选中的值
    C# 后台按键 视频播放器 全屏后无法 触发
    C# 调用win32API 获取进程句柄 有毛用???
    C# 键盘钩子
    C# SqlParameter 使用
    C# 获得星期几
  • 原文地址:https://www.cnblogs.com/tenlee/p/4420132.html
Copyright © 2011-2022 走看看