食物链
来源:互联网 发布:小天才软件下载 编辑:程序博客网 时间:2024/04/18 06:04
http://codevs.cn/problem/1074/
并查集。好像入了点门
开数组的时候开成3倍的
用1~n 表示动物本身
用n+1~2*n表示被这种动物吃的
用2*n+1~3*n表示吃这种动物的
那么如果x吃y是真话
则合并R[x]和R[y+n],R[x+n]和R[y+2*n],R[x+2*n]和R[y]
如果x和y是同类是真话
合并R[x]和R[y],R[x+n]和R[y+n],R[x+2*n]和R[y+2*n]
判断:
x吃y,判断R[x]跟R[y+n]是否同根
x和y是同类,判断R[x]根R[y]是否同根
PS:以上内容如有雷同,纯属COPY。
求个可以快速格式化的编译器呀。每次自己排版好累。
#include<iostream>#include<stdio.h>#include<cmath>#include<string.h>#include<algorithm>using namespace std;int relation[150005]={0};int find(int weizhi){ if(relation[weizhi]==weizhi) return weizhi; return relation[weizhi]=find(relation[weizhi]);}void hebing(int y,int z){ if(find(y)!=find(z)) { relation[relation[y]]=relation[z]; }}int main(){ int n,k; cin>>n>>k; for(int i=1;i<=3*n;i++) relation[i]=i; int x,y,z; int daan=0; for(int i=0;i<k;i++) { scanf("%d%d%d",&x,&y,&z); if(y>n||z>n||(z==y&&x==2)) { daan++; }else if(x==1) { if(find(y)==find(n+z)||find(y)==find(n*2+z)||find(n+y)==find(z)||find(n*2+y)==find(z)) { daan++; continue; } hebing(y,z); hebing(y+n,z+n); hebing(2*n+y,2*n+z); }else if(x==2) { if(find(y)==find(z)||find(y)==find(n+z)||find(n*2+y)==find(z)) { daan++; continue; } hebing(y,n*2+z); hebing(n+y,z); hebing(n*2+y,n+z); } } cout<<daan<<endl; return 0;}
0 0
- 食物链
- 食物链
- 食物链
- 食物链
- 食物链
- 食物链
- 食物链
- 食物链
- 食物链
- 食物链
- 食物链
- 食物链
- 食物链
- 食物链
- 食物链
- 食物链
- 食物链
- 食物链
- 代理衍生及实现
- 分享:Android系统的常用权限整理
- Chrome/Chromium HTML5 video 视频播放硬件加速
- Chapter 6 : Delegation和Debug - The Big Nerd Ranch Guide 读书笔记
- ubuntu下无法启动谷歌浏览器
- 食物链
- iOS View添加圆角
- 嵌入式SQL应用(C语言)
- HTML标签
- 协议及其注意事项
- linux下检查内存泄露的工具--mtrace
- 如何搞定foxmail下的.eml文件导入到win7内的outlook2007
- 对于STM32别名区的理解 (转载)
- [转]NAT、防火墙的原理区别和分类