博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj1703--Find them, Catch them
阅读量:5251 次
发布时间:2019-06-14

本文共 1521 字,大约阅读时间需要 5 分钟。

题意:一个城市n个犯罪嫌疑人,编号1-n,每次输入D x y表示x y属于同一帮派,A x y询问x y是否同一帮派或者不确定。

带权、种类并查集裸题,图片质量不好还请见谅。。oet[fx] = (oet[y]-oet[x]+d+2)%2   根据箭头关系就可以得出这个式子了,,加2是防止出现负值

 

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;typedef unsigned long long ull;typedef long long ll;const int inf = 0x3f3f3f3f;const double eps = 1e-8;const int maxn =1e5+10;int n,m;int pa[maxn],oet[maxn];void init(){ for (int i = 0; i < maxn; i++) { pa[i] = i; } memset(oet,0,sizeof(oet));}int find(int x){ if (pa[x] == x) { return x; } else { int tmp = pa[x]; pa[x] = find(tmp); oet[x] = (oet[x]+oet[tmp])%2; return pa[x]; }}void union_set(int x,int y,int d){ int fx = find(x); int fy = find(y); if (fx == fy) return; pa[fx] = fy; oet[fx] = (oet[y]-oet[x]+d+2)%2;//oet[x] 表示x对其父亲的偏移量。至于这个式子怎么退出的,,就用向量来推,起点到终点}void query(int x,int y){ int fa = find(x); int fy = find(y); if (fa != fy) //x y不在一个集合中自然不能确定关系。 { printf("Not sure yet.\n"); return; } int tmp = (oet[x]-oet[y]+2)%2; //在求这种关系式的时候可以借助数学的向量来推导。 if (tmp==1) printf("In different gangs.\n"); else printf("In the same gang.\n");}int main(void){ int t; cin>>t; while (t--) { scanf("%d%d",&n,&m); char ch[10]; int x,y; init(); for (int i = 0; i < m; i++) { scanf("%s%d%d",ch,&x,&y); if (ch[0]=='A') { query(x,y); } else { union_set(x,y,1); } } } return 0;}

  

  

 

转载于:https://www.cnblogs.com/oneshot/p/3982753.html

你可能感兴趣的文章
C# 之 提高WebService性能大数据量网络传输处理
查看>>
[bzoj1004] [HNOI2008] Cards
查看>>
原生HttpClient详细使用示例
查看>>
几道面试题
查看>>
Factory Design Pattern
查看>>
python中贪婪与非贪婪
查看>>
guava API整理
查看>>
无锁编程笔记
查看>>
jquery mobile
查看>>
如何在vue单页应用中使用百度地图
查看>>
P1192-台阶问题
查看>>
一、使用pip安装Python包
查看>>
spring与quartz整合
查看>>
Kattis之旅——Eight Queens
查看>>
3.PHP 教程_PHP 语法
查看>>
Duilib扩展《01》— 双击、右键消息扩展
查看>>
利用Fiddler拦截接口请求并篡改数据
查看>>
python习题:unittest参数化-数据从文件或excel中读取
查看>>
在工程中要加入新的错误弹出方法
查看>>
PS 滤镜— — sparkle 效果
查看>>