POJ 3207 Ikki's Story IV - Panda's Trick (2-SAT,基础)
题意:
有一个环,环上n个点,现在在m个点对之间连一条线,线可以往圆外面绕,也可以往里面绕,问是否必定会相交?
思路:
根据所给的m条边可知,假设给的是a-b,那么a-b要么得绕环外,要么只能在环内,除非a和b是连续的点才不会影响到任何弧,否则一定会多少影响其他弧的走势。比如样例所举出的 0-2和 1-3,就必须有一条弧选择外环,一个选择内环。
如何使他们有序不冲突呢?其实这题跟环上的点没多大关系,而且给的点数n也没什么用,而倒是边才重要。我们要做的是让边不冲突。那么肯定是要先选出可能冲突的边来处理,让他们有序而不冲突。
那么什么时候会冲突?上面所讲的那样就会冲突了,所以我们要将有可能冲突的边全部找出来,那些连边都没有的点是没有用的,连边都没有,谈什么冲突。
根据冲突边来建图?若有两条边x和y冲突了,那么一条必须在内,另一条相反。则按照2-SAT的模型,选择了x在内,y则必须在外;选择了y在内,则x必须在外。将x放在环外和环内作为两个点,y也同理,将他们连上对应的有向边 “内x->外y”(可以用2*x和2*x+1这种方式代替环内环外的)。这里是以边作为点的。即每条边有两种可能,但是不能同时选,这和2-SAT模型一样。根据这个模型可以建图了。
求解方式?建图后用tarjan算法求强连通分量,根据边不能同时在环外和环内的规则,如果发现同时在环外/内就判其实无解的。
- #include <iostream>
- #include <stdio.h>
- #include <string.h>
- #include <vector>
- #include <stack>
- #include <algorithm>
- #define LL long long
- #define INF 0x7f7f7f7f
- using namespace std;
- const int N=+;
- vector<int> vect[N*];
- int e[N][];
- int lowlink[N*], dfn[N*], scc_no[N*], dfn_clock, scc_cnt;
- stack<int> stac;
- void DFS(int x)
- {
- stac.push(x);
- dfn[x]=lowlink[x]=++dfn_clock;
- for(int i=; i<vect[x].size(); i++)
- {
- int t=vect[x][i];
- if(!dfn[t])
- {
- DFS(t);
- lowlink[x]=min(lowlink[x],lowlink[t]);
- }
- else if(!scc_no[t])
- lowlink[x]=min(lowlink[x],dfn[t]);
- }
- if(lowlink[x]==dfn[x])
- {
- scc_cnt++;
- while(true)
- {
- int t=stac.top();stac.pop();
- scc_no[t]=scc_cnt;
- if(t==x) break;
- }
- }
- }
- int cal(int up)
- {
- scc_cnt=dfn_clock=;
- memset(scc_no,,sizeof(scc_no));
- memset(lowlink,,sizeof(lowlink));
- memset(dfn,,sizeof(dfn));
- for(int i=; i<up; i++) if(!dfn[i]) DFS(i); //求强连通分量
- for(int i=; i<up; i+=) if(scc_no[i]==scc_no[i+]) return false; //同在一个强连通分量内
- return true;
- }
- int main()
- {
- //freopen("input.txt", "r", stdin);
- //仅有1个测试例子
- int n, m, a, b;
- scanf("%d%d",&n,&m);
- for(int i=; i<m; i++)
- {
- scanf("%d%d",&e[i][],&e[i][]);
- if(e[i][]>e[i][]) swap(e[i][],e[i][]); //保证小在前
- }
- for(int i=; i<m; i++) //穷举每条弧与其他弧的关系:相当于以点建图
- {
- a=e[i][];
- b=e[i][];
- for(int j=i+; j<m; j++)
- {
- int c=e[j][];
- int d=e[j][];
- if( a<c && c<b && b<d || c<a && a<d && d<b ) //弧冲突了 a<c<b<d || c<a<d<b
- {
- vect[i*].push_back(j*+); //只有错开才能无冲突
- vect[j*].push_back(i*+);
- vect[i*+].push_back(j*);
- vect[j*+].push_back(i*);
- }
- }
- }
- if(cal(m*)) puts("panda is telling the truth...");
- else puts("the evil panda is lying again");
- return ;
- }
AC代码
POJ 3207 Ikki's Story IV - Panda's Trick (2-SAT,基础)的更多相关文章
- POJ 3207 Ikki's Story IV - Panda's Trick(2-sat问题)
POJ 3207 Ikki's Story IV - Panda's Trick(2-sat问题) Description liympanda, one of Ikki's friend, likes ...
- poj 3207 Ikki's Story IV - Panda's Trick (2-SAT)
http://poj.org/problem?id=3207 Ikki's Story IV - Panda's Trick Time Limit: 1000MS Memory Limit: 13 ...
- POJ 3207 Ikki's Story IV - Panda's Trick
Ikki's Story IV - Panda's Trick Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 7296 ...
- POJ 3207 Ikki's Story IV - Panda's Trick (2-sat)
Ikki's Story IV - Panda's Trick Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 6691 ...
- poj 3207 Ikki's Story IV - Panda's Trick【2-SAT+tarjan】
注意到相交的点对一定要一里一外,这样就变成了2-SAT模型 然后我建边的时候石乐志,实际上不需要考虑这个点对的边是正着连还是反着连,因为不管怎么连,能相交的总会相交,所以直接判相交即可 然后tarja ...
- POJ 3207 Ikki's Story IV - Panda's Trick 2-sat模板题
题意: 平面上,一个圆,圆的边上按顺时针放着n个点.现在要连m条边,比如a,b,那么a到b可以从圆的内部连接,也可以从圆的外部连接.给你的信息中,每个点最多只会连接的一条边.问能不能连接这m条边,使这 ...
- 【POJ】3207 Ikki's Story IV - Panda's Trick
http://poj.org/problem?id=3207 题意:一个圆上顺时针依次排列着标号为1-n的点,这些点之间共有m条边相连,每两个点只能在圆内或者圆外连边.问是否存在这些边不相交的方案.( ...
- 【POJ3207】Ikki's Story IV - Panda's Trick
POJ 3207 Ikki's Story IV - Panda's Trick liympanda, one of Ikki's friend, likes playing games with I ...
- Ikki's Story IV - Panda's Trick POJ - 3207(水2 - sat 在圈内 还是 在圈外)
题意: 就是一个圈上有n个点,给出m对个点,这m对个点,每一对都有一条边,合理安排这些边在圈内或圈外,能否不相交 解析: 我手残 我手残 我手残 写一下情况 只能是一个在圈外 一个在圈内 即一个1一个 ...
随机推荐
- phpmailer 实现发送邮件
在注册的时候,常常会用到邮件验证,一直想弄明白这是怎么实现的,记得2年前曾经试过这个问题,没有实现,今天困到不行的时候开始决定搞明白这个,然后,然后就出来了. <?php require(&qu ...
- thinkphp操作数据库
1.实现or操作: $where=array( 'city'=>array('like',array('%'.$_GET['city'].'%')); 'hangye'=>array('l ...
- 由底层和逻辑说开去——c++之类与对象的深入剖析
类是什么,对象是什么, 这两个问题在各个c++书里面都以一种抽象的描述方式,给了我们近乎完美的答案,然后我好像就知道什么是类什么是对象了,但是当扪心自问,类在哪儿,对象在哪儿,成员方法在哪儿,成员变 ...
- WPF中禁止WebBrowser控件打开新窗口
一.针对纯WPF的WebBrowser控件: <summary> Suppress Script Errors In WPF WebBrowser </summary> pub ...
- sublime text2 中文乱码的解决办法
1.安装Sublime Package Control 在Sublime Text 2上用Ctrl+-打开控制台并在里面输入以下代码,Sublime Text 2就会自动安装Package Contr ...
- PHP视频教程 > PHP面向对象编程视频教程
当前位置: 主页 > 编程开发 > PHP视频教程 > PHP面向对象编程视频教程 > kingstone金士顿手机内存卡16G仅65元 1.1.什么是面向对象和类 上传日期: ...
- Linux内核树的建立-基于ubuntu系统
刚看 O'REILLY 写的<LINUX 设备驱动程序>时.作者一再强调在编写驱动程序时必须 建立内核树.先前的内核只需要有一套内核头文件就够了,但因为2.6的内核模块吆喝内核源码树中的目 ...
- div蒙版+可移动
<html> <head> <title></title> <script src="jquery-1.8.2.js&q ...
- 阿里云Ubuntu服务器安装java环境
一.下载jdk wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-secureb ...
- UINavigationController 总结
一 . UINavigationBar 1.获取 UINavigationBar 对象: [UINavigationBar appearance] ,可以通过该方法对全部 navigation 进行设 ...