poj1182
并查集,这道题以前做过,但是再看到时,很陌生,只知道是并查集,一开始不想想,感觉自己不会,想看答案,可是坚持着想了一下,就想出来了,不过一直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; }