记录编号 |
224923 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[NOI 2001]食物链 |
最终得分 |
100 |
用户昵称 |
Hzoi_ |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.101 s |
提交时间 |
2016-02-16 19:31:55 |
内存使用 |
0.67 MiB |
显示代码纯文本
#include<cstdio>
using namespace std;
const int maxn=50010;
struct tree{
int prt,rela;
tree(){
rela=0;
}
}node[maxn];
int mod(int x){
if(x>2)return x-3;
if(x>-1)return x;
if(x>-4)return x+3;
return x+6;
}
int find(int x){
if(node[x].prt!=x){
int r=node[x].prt;
node[x].prt=find(node[x].prt);
node[x].rela=mod(node[x].rela+node[r].rela);
}
return node[x].prt;
}
bool connected(int x,int y){
return find(x)==find(y);
}
void mergep(int rx,int ry){
node[rx].prt=ry;
}
void merge(int x,int y){
mergep(node[x].prt,node[y].prt);
node[node[x].prt].rela=mod(3-node[x].rela+node[y].rela);
}
int n,k,d,x,y,t=0;
int main(){
freopen("eat.in","r",stdin);
freopen("eat.out","w",stdout);
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++)node[i].prt=i;
for(int i=0;i<k;i++){
if(scanf("%d%d%d",&d,&x,&y)!=3)break;
if(x>n||y>n){
t++;
continue;
}
int k=d-1;
int rx=find(x),ry=find(y);
if(rx==ry){
if(mod(node[x].rela-node[y].rela)!=k)t++;
}
else{
node[rx].rela=mod(node[y].rela-node[x].rela+k);
node[rx].prt=ry;
}
/*if(d==1){
if(connected(x,y)){
if(node[x].rela!=node[y].rela)t++;
}
else merge(x,y);
}
else if(d==2){
if(connected(x,y)){
if(mod(node[x].rela-node[y].rela)!=2)t++;
}
else merge(x,y);
}*/
}
printf("%d",t);
fclose(stdin);fclose(stdout);
}