POJ 1703 Find them, Catch them
2016-02-16 09:26
218 查看
又是没学过的。。。。。。。种类并查集
其实就是维护每个点到当前集的根节点的距离的奇偶性。
距离为奇代表和根不同种类,为偶代表和根同种类。
find和merge的时候维护一下就好了。
但是我觉得这题有离线做法啊………………
先把图建出来,然后黑白染色,再跑一遍,用并查集维护连通性,两点不连通就是not sure,连通就用颜色判断一下。结果WA掉了,不知为何。
唉……
其实就是维护每个点到当前集的根节点的距离的奇偶性。
距离为奇代表和根不同种类,为偶代表和根同种类。
find和merge的时候维护一下就好了。
但是我觉得这题有离线做法啊………………
先把图建出来,然后黑白染色,再跑一遍,用并查集维护连通性,两点不连通就是not sure,连通就用颜色判断一下。结果WA掉了,不知为何。
唉……
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int N=100000+5; int pa ,dis ; int find(int x){ if(x==pa[x])return x; int tmp=find(pa[x]); dis[x]=(dis[x]+dis[pa[x]])&1; return pa[x]=tmp; } void merge(int u,int v){ int x=find(u),y=find(v); if(x!=y){ pa[x]=y; dis[x]=(dis[u]+dis[v]+1)&1; } } int main(){ //freopen("a.in","r",stdin); int T;scanf("%d",&T); while(T--){ int n,m;scanf("%d%d",&n,&m); for(int i=1;i<=n;i++)pa[i]=i,dis[i]=0; char opt[5];int u,v; while(m--){ scanf("%s%d%d",opt,&u,&v); if(opt[0]=='D')merge(u,v); else{ if(find(u)!=find(v))puts("Not sure yet."); else if(dis[u]!=dis[v]) puts("In different gangs."); else puts("In the same gang."); } } } return 0; }
相关文章推荐
- MapReduce实例浅析
- 以前写的比较实用的mysql代码[1]
- 数字自动增长
- VS2013失去智能提示如何恢复
- linux进程的后台运行、查看、关闭等命令
- Emmet:HTML/CSS代码快速编写神器
- 双面打印区别
- MapReduce经典案例分享
- poj 2398 Toy Storage(叉积判断点是否在四边形内)
- latex的数学符号式子(自用
- XML总结
- 自己实现 一个MapReduce 示例
- 过完年电脑上的证书都失效了
- Sipdroid源码初探(二):监听来电,通话建立流程
- 利用Google成为一个更好的程序员
- 测试之道--编码
- Android开发判断SQLite数据库中某个表是否存在
- hadoop中使用MapReduce编程实例(转)
- udhcpc的应用
- BlueTooth Profiles