【poj 1182】 食物链 题解&代码(C++)
2016-04-06 08:46
453 查看
经典的并查集关系类问题,还是类似 poj1703 的方法,用x+n表示 x所吃的集合,用x+2×n表示 吃x的集合 ,然后用并查集连连连就行。。。
#include<iostream> #include<string.h> #include<stdio.h> using namespace std; int fa[509999]; inline void chushihua(int n) { for (int i=1;i<=n;i++) fa[i]=i; } int find(int x) { if (fa[x]==x) return x; return fa[x]=find(fa[x]); } int unio(int x,int y) { return fa[find(x)]=find(y); } int main() { int n,m,a,b,c; scanf("%d%d",&n,&m); chushihua(3*n); int ans=0; for (int i=1;i<=m;i++) { scanf("%d%d%d",&a,&b,&c); if (b>n || c>n || (a==2&&b==c) || b<=0 || c<=0) {ans++;continue;} if (a==1) { if (find(b)!=find(c) && find(c+n)!=find(b) && find(c+2*n)!=find(b) && find(c)!=find(b+n) &&find(c)!=find(b+n+n)) { unio(b,c); unio(b+n,c+n); unio(b+2*n,c+2*n); } else if (find(b)==find(c)) continue; else if (find(b)!=find(c) && (find(c+n)==find(b) || find(c+2*n)==find(b) || find(c)==find(b+n) || find(c)==find(b+n+n))) ans++; } else if (a==2) { if (find(b)==find(c) || find(c)==find(b+n)) {ans++;continue;} else { unio(c+n,b); unio(b+2*n,c); unio(b+n,c+n+n); } } } cout<<ans<<endl; }
相关文章推荐
- 【poj 2352】Stars 题意&题解&代码(C++)
- python制作爬虫并将抓取结果保存到excel中
- 通过scrapy爬取一号店商品信息
- 【LeetCode-236】Lowest Common Ancestor of a Binary Tree
- python编程基础-数据类型和函数
- java aopalliance-1.0.jar这个包是做什么用的?
- java线程Demo
- Java——Iterate through a HashMap
- 解决Python2.7的UnicodeEncodeError: ‘ascii’ codec can’t encode异常错误
- Asp.Net 动态生成验证码
- ASP.NET 防盗链源码
- java 搭建webservice服务+testclient測试
- 几组线程同步代码测试
- 通过反编译深入理解Java String及intern
- 浅谈JAVA ThreadPoolExecutor(转)
- java.sql.SQLException: 无效的列索引
- Java 面向对象基础语法
- Lambda expression in C++ & Haskell || C++ 中的匿名函数 [EN/CN]
- Java 如何有效地避免OOM:善于利用软引用和弱引用
- Java 面向对象基础