博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷 [P2024] 食物链
阅读量:4977 次
发布时间:2019-06-12

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

并查集

这是一道比较特殊的并查集,开一个三倍的数组, 1~n保存同类,n~n×2保存猎物,n2~n3保存天敌;

#include 
#include
#include
#include
using namespace std;const int MAXN=300005;int read(){ int rv=0,fh=1; char c=getchar(); while(c<'0'||c>'9'){ if(c=='-') fh=-1; c=getchar(); } while(c>='0'&&c<='9'){ rv=(rv<<1)+(rv<<3)+c-'0'; c=getchar(); } return rv*fh;}int fa[MAXN],n,k,tot;int find(int x){ if(fa[x]!=x) fa[x]=find(fa[x]); return fa[x];}void merge(int x,int y){ int r1=find(x),r2=find(y); if(r1!=r2){ fa[r1]=r2; }}int main(){ freopen("in.txt","r",stdin); n=read();k=read(); for(int i=1;i<=n*3;i++){ fa[i]=i; } for(int i=1;i<=k;i++){ int t=read(),a=read(),b=read(); if(t==2&&a==b){ tot++;continue; } if(a>n||b>n){ tot++;continue; } if(t==1){ if((find(a)!=find(b+n))&&(find(a+n)!=find(b))&&(find(a)!=find(b+n*2))&&(find(a+n*2)!=find(b))){ merge(a,b); merge(a+n,b+n); merge(a+n*2,b+n*2); }else{ tot++;continue; } }else { if((find(a)!=find(b))&&(find(b+n)!=find(a))&&(find(a+n*2)!=find(b))){ merge(a+n,b); merge(b+n*2,a); merge(b+n,a+n*2); }else tot++; } } cout<

转载于:https://www.cnblogs.com/Mr-WolframsMgcBox/p/7868340.html

你可能感兴趣的文章
bzoj1069[SCOI2007]最大土地面积
查看>>
团队开发介绍
查看>>
add a custom action to a SharePoint list actions menu for a specific list or content type
查看>>
详解C++中的纯虚函数(虚函数区别)&多态性以及实例应用
查看>>
nginx+uWSGI+django+virtualenv+supervisor发布web服务器
查看>>
YUV格式分析
查看>>
Windows 窗体启动和关闭的事件顺序
查看>>
jrebel使用
查看>>
SQL SERVER分区具体例子详解
查看>>
状态机实践入门
查看>>
类模板
查看>>
在 JQuery Mobile 中实现瀑布流图库布局
查看>>
Android最佳性能实践(一)——合理管理内存
查看>>
js对象取值的两种方式
查看>>
软件绿色版和安装版的区别
查看>>
HeapSpray初窥(2014.12)
查看>>
hdu5437 优先队列 长春网赛
查看>>
每日模板一练——树链剖分求LCA(好吧是真的写错了)
查看>>
常用图像数据集:标注、检索
查看>>
python基础补漏-02-collection
查看>>