POJ-1182-食物链 [种类并查集]

来源:互联网 发布:使命召唤14二战 知乎 编辑:程序博客网 时间:2024/06/05 17:55

题目传送门


思路:
分类并查集,分三个类,主要处理好三个类之间的关系就好了。挑战程序设计竞赛例题。

#include <algorithm>#include <iostream>#include <cstdlib>#include <cstring>#include <cstdio>#include <cmath>#include <queue>using namespace std;int fa[200000+100], N, K;void init(){    for (int i = 1; i <= 200000; i++)        fa[i] = i;    return;}int find(int x){    while (x!=fa[x]) x = fa[x];    return x;}bool same(int x, int y){    return find(x)==find(y);}void unite(int x, int y){    x = find(x);    y = find(y);    if (x != y)        fa[x] = y;}int main(void){    //freopen("in.txt","r",stdin);    //freopen("out.txt","w",stdout);    scanf("%d %d", &N, &K);        int ans = 0;        init();        while (K--)        {            int x, y, s;            scanf("%d %d %d", &s, &x, &y);            if (x>N || y>N || x<1 || y<1)            {                ans++;            }            else if (s==1)            {                if (same(x, y+N) || same(x, y+2*N)) ans++;                else                {                    unite(x, y);                    unite(x+N, y+N);                    unite(x+2*N , y+2*N);                }            }            else if (s==2)            {                if (same(x, y) || same(x, y+2*N)) ans++;                else                {                    unite(x, y+N);                    unite(x+N, y+2*N);                    unite(x+2*N, y);                }            }        }        printf("%d\n", ans);    return 0;}
原创粉丝点击