记录编号 |
232872 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[NOI 2001]食物链 |
最终得分 |
100 |
用户昵称 |
洛克索耶夫 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.057 s |
提交时间 |
2016-03-03 12:03:27 |
内存使用 |
1.08 MiB |
显示代码纯文本
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
//子节点与根节点的关系 一致或不一致/合并
//向量推出关系 0同类 1x吃y 2y吃x
//保存与根节点的关系,列表找关系(推一推),向量 (路径压缩、合并)
int N,K,root[100100]={0},rela[100100]={0};
int Read()
{
char ch=getchar();
int a=0;
while(ch<'0'||ch>'9') ch=getchar();
while(ch>='0'&&ch<='9'){
a=a*10+ch-'0';
ch=getchar();
}
return a;
}
int FindRoot(int a)
{
if(root[a]!=a){
int r=root[a];
root[a]=FindRoot(root[a]);
rela[a]=(rela[a]+rela[r])%3;
}
return root[a];
}
void Union(int type, int a, int b)
{
int ra=FindRoot(a),rb=FindRoot(b);
root[ra]=rb;
rela[ra]=((3-rela[a])+type-1+rela[b])%3;
}
bool Judge(int type, int x, int y)
{
if(type==2&&x==y) return false;
if(x>N||y>N) return false;
if(FindRoot(x)!=FindRoot(y)){
Union(type, x, y);
return true;
}
if(rela[x]!=(type-1+rela[y])%3) return false;
return true;
}
int main()
{
freopen("eat.in","r",stdin);
freopen("eat.out","w",stdout);
int x,y,type,ans=0;
N=Read();K=Read();
for(int i=1;i<=N;i++) root[i]=i;
for(int i=1;i<=K;i++){
type=Read();x=Read();y=Read();
if(!Judge(type, x, y)) ans++;
}
printf("%d",ans);
return 0;
}