hdu 2492 A Bug's Life
2016-07-27 11:12
148 查看
题意:n只虫子,有两种性别,给出m次交配情况(正常是异性),问是否会出现同性交配的情况
分析:两种方法解决 ,第一眼看到这道题,就是二分图染色,bfs一下,有没有解救Ok了,确实个并查集题,尴尬
2-SAT解法,把一个点拆成两个点,是和非 ,a b为异的话,那么a和b非 ,a非和b,x表示是,x+n表示否成立,只要每个集合不冲突,也就是a和b不出现在一个集合里面,那么就有解,每次判断是否冲突,冲突就无解,否则就把(a,b+n),(a+n,b)合并
View Code
第二个就是带权并查集,博客多的是,查一下就好
分析:两种方法解决 ,第一眼看到这道题,就是二分图染色,bfs一下,有没有解救Ok了,确实个并查集题,尴尬
2-SAT解法,把一个点拆成两个点,是和非 ,a b为异的话,那么a和b非 ,a非和b,x表示是,x+n表示否成立,只要每个集合不冲突,也就是a和b不出现在一个集合里面,那么就有解,每次判断是否冲突,冲突就无解,否则就把(a,b+n),(a+n,b)合并
#include<bits/stdc++.h> using namespace std; const int maxn=1e5+5; int f[maxn],v[maxn]; void init(int n){ for(int i=0;i<=n;i++) f[i]=i,v[i]=0; } int find(int x){ return x==f[x]?x:f[x]=find(f[x]); } void bing(int x,int y){ int t1=find(x); int t2=find(y); if(t1!=t2) f[t2]=t1; } int main(){ int t,cas=1,n,m,x,y; scanf("%d",&t); while(t--){ scanf("%d%d",&n,&m); init(n*2); bool ans=1; while(m--){ scanf("%d%d",&x,&y); if(!ans)continue; int t1=find(x); int t2=find(y); if(t1==t2)ans=0; bing(x,y+n); bing(x+n,y); } printf("Scenario #%d:\n",cas++); if(ans) puts("No suspicious bugs found!"); else puts("Suspicious bugs found!"); puts(""); } return 0; }
View Code
第二个就是带权并查集,博客多的是,查一下就好
相关文章推荐
- 零散的JavaScript公用方法
- 深入理解javascript闭包
- 利用sirius定义图形样式
- angular2 之 form表单
- js性能优化的小知识
- 活动H5 类型总结 啪啪啪哎哟A股你大爷啊
- JSONModel源代码解析
- html + css + js初步简单学习笔记
- DAY12:leetcode #24 Swap Nodes in Pairs
- 【KMP】BZOJ3942-[Usaco2015 Feb] Censoring
- Html-布局基础记录
- JSON与XML的区别比较
- Jackson常用注解介绍
- iClient for JavaScript求两线交点、线线打断、点打断线
- [leetcode]376. Wiggle Subsequence -- JavaScript代码
- 建站过程中对浏览器样式的初始化问题
- jquery中使用serialize() 序列化表单时 中文乱码问题
- Flexbox布局样式
- 【freecodecamp】HTML5和CSS知识点
- js中字符串转换成数组