码迷,mamicode.com
首页 > 其他好文 > 详细

poj 1182 食物链

时间:2018-09-13 23:59:19      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:microsoft   --   div   str   sed   ini   std   color   font   

带权并查集食物链(模3系),三个物种,给一些关系,同类、被吃、吃。问哪些关系是错的。

同类关系是0,点吃根节点的关系是1,根节点吃点关系是2即可。

 

 

 

技术分享图片
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
using namespace std;
const int M = 5e4+7;
int n,q;
int f[M],cnt[M];
void init(){
    for(int i=0;i<=n;i++) f[i]=i,cnt[i]=0;
}
int find(int x){
    if(x==f[x]) return x;
    int tmp=f[x];
    f[x]=find(f[x]);
    cnt[x]=(cnt[x]+cnt[tmp])%3;
    return f[x];
}
int u,v,fu,fv,ans,op;
int main(){
    freopen("1.in","r",stdin);
    freopen("1.out","w",stdout);
    scanf("%d%d",&n,&q);
    ans=0;
    init();
    while(q--){    
        scanf("%d%d%d",&op,&u,&v);op-=1;
        if(u>n||v>n||(u==v&&op==1)){
            ans++;continue;
        }
        fu=find(u),fv=find(v);
        if(fu==fv){
            if((cnt[u]-cnt[v]+3)%3!=op) ans++;//u和v与根节点的距离之差和给的关系不同则是liar
        }
        else{
            f[fu]=fv;
            cnt[fu]=(cnt[v]-cnt[u]+op+3)%3;//op是u和v关于新根节点的距离之差,把u的根挂到v的根上
        }
    }
    printf("%d\n",ans);
    return 0;
}
View Code

 

poj 1182 食物链

标签:microsoft   --   div   str   sed   ini   std   color   font   

原文地址:https://www.cnblogs.com/LMissher/p/9643828.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有 京ICP备13008772号-2
迷上了代码!