POJ 1703 Find them, Catch them
2015-12-10 17:28
459 查看
并查集的经典题型,一共有两种操作:两个案件AB不是同一个团伙,询问AB是不是同一个团伙作案
我在结构体中定义两个元素,一个记录其父节下标,另一个记录其与父节点的关系,如果是同一个组织那么就记为0,否则记为1,在进行带路径压缩的查找父节点操作的时候可以用异或运算来计算节点与根节点的关系。
利用这种思路也可以解决另一道叫做“食物链”的题目
我在结构体中定义两个元素,一个记录其父节下标,另一个记录其与父节点的关系,如果是同一个组织那么就记为0,否则记为1,在进行带路径压缩的查找父节点操作的时候可以用异或运算来计算节点与根节点的关系。
利用这种思路也可以解决另一道叫做“食物链”的题目
#include <memory.h> #include <iostream> #include <cstdio> using namespace std; #define maxn 100050 struct node{ int fa; int relation; }; node c[maxn]={0}; int findfa(int arg){ if(arg == c[arg].fa) return arg; int temp = c[arg].fa; c[arg].fa = findfa(temp); c[arg].relation ^= c[temp].relation; return c[arg].fa; } void add(int arg1,int arg2){ int fa1 = findfa(arg1); int fa2 = findfa(arg2); c[fa2].fa = fa1; c[fa2].relation =!(c[arg1].relation^c[arg2].relation); } void ask(int arg1,int arg2){ int fa1 = findfa(arg1); int fa2 = findfa(arg2); if(fa1 != fa2){ printf("Not sure yet.\n"); return; } if(c[arg1].relation == c[arg2].relation){ printf("In the same gang.\n"); } else{ printf("In different gangs.\n"); } } int main(){ int t; scanf("%d",&t); while(t--){ int m,n; scanf("%d%d",&n,&m); cin.get(); memset(c,0,sizeof(c)); for(int i=1;i<=n;++i) c[i].fa = i; while(m--){ char ins,h; int arg1,arg2; scanf("%c%d%d%c",&ins,&arg1,&arg2,&h); switch(ins){ case 'D': add(arg1,arg2); break; case 'A': ask(arg1,arg2); break; default: //printf("Input error!\n"); break; } /*for(int i=1;i<=n;++i) printf("%d %d\n",c[i].fa,c[i].relation);*/ } } //system("pause"); return 0; }
相关文章推荐
- NIO DirectByteBuffer深入理解
- Android 的Handler、Looper和MessageQueue的关系和实现原理
- MyBatis+MySql Insert操作失败解决办法
- Protocol Buffer技术详解(语言规范)
- Hibernate、SpringJDBC中在注解模式下获取数据库连接
- linux终端常用快捷键
- 判断出栈顺序
- GSM模块短信发送举例
- ubuntu 安装软件
- 最长上升子序列 nlogn时间复杂度 poj 2533
- 平台主数据库支持类型及配置说明
- unicode
- Android 设置EditText光标颜色及粗细
- SAS简单绘图
- SoapUI + Groovy 接口自动化
- C++设计模式新解一 代理模式 (PS设计模式的必要性)
- python+stomp+activemq
- MySQL数据类型
- win10关于仅仅只能创建文件夹的问题
- 老李分享:测试工程师的命运