并查集,这道题以前做过,但是再看到时,很陌生,只知道是并查集,一开始不想想,感觉自己不会,想看答案,可是坚持着想了一下,就想出来了,不过一直wr在只有一组数据,我却写了个while输入,直到文件结尾,差错了很久
参考代码:
http://blog.csdn.net/gemire/article/details/20566907
http://blog.csdn.net/shahdza/article/details/7779230
(食堂里的日本豆腐很好吃,底下有一层很想的鸡蛋,学校门口的菜煎饼很好吃,小的时候很喜欢吃,但是长大后就很少见,上高中的时候,好像还有一次吃晚饭的时间,逃出去买了个菜煎饼,没来得及吃,就往回赶,怕迟到,结果在教室偷偷吃完)
2015.10.5:
hahaha
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
#define N 50010
int fa[3*N];
int get_root(int x){
if(fa[x]==x){
return x;
}
else{
fa[x]=get_root(fa[x]);
return fa[x];
}
}
int main(){
int n,k;
int op,a,b;
int ans;
/*while(*/scanf("%d%d",&n,&k);/*!=EOF){*/
for(int i=1;i<=3*n;i++){
fa[i]=i;
}
ans=0;
for(int i=0;i<k;i++){
scanf("%d%d%d",&op,&a,&b);
if(a>n||a<1||b>n||b<1){
ans++;
}
else{
int ra=get_root(a);
int ran=get_root(a+n);
int ra2n=get_root(a+2*n);
int rb=get_root(b);
int rbn=get_root(b+n);
int rb2n=get_root(b+2*n);
if(op==1){
if(ran==rb||rbn==ra){
ans++;
}
else{
if(ra!=rb){
fa[ra]=rb;
fa[ran]=rbn;
fa[ra2n]=rb2n;
}
}
}
else if(op==2){
if(ra==rb||rbn==ra){
ans++;
}
else{
if(ran!=rb){
fa[ran]=rb;
fa[ra]=rb2n;
fa[ra2n]=rbn;
}
}
}
}
}
printf("%d\n",ans);
/*}*/
return 0;
}