题意:

  有一个环,环上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,基础)的更多相关文章

  1. 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 ...

  2. 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 ...

  3. 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   ...

  4. 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   ...

  5. poj 3207 Ikki's Story IV - Panda's Trick【2-SAT+tarjan】

    注意到相交的点对一定要一里一外,这样就变成了2-SAT模型 然后我建边的时候石乐志,实际上不需要考虑这个点对的边是正着连还是反着连,因为不管怎么连,能相交的总会相交,所以直接判相交即可 然后tarja ...

  6. POJ 3207 Ikki's Story IV - Panda's Trick 2-sat模板题

    题意: 平面上,一个圆,圆的边上按顺时针放着n个点.现在要连m条边,比如a,b,那么a到b可以从圆的内部连接,也可以从圆的外部连接.给你的信息中,每个点最多只会连接的一条边.问能不能连接这m条边,使这 ...

  7. 【POJ】3207 Ikki's Story IV - Panda's Trick

    http://poj.org/problem?id=3207 题意:一个圆上顺时针依次排列着标号为1-n的点,这些点之间共有m条边相连,每两个点只能在圆内或者圆外连边.问是否存在这些边不相交的方案.( ...

  8. 【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 ...

  9. Ikki's Story IV - Panda's Trick POJ - 3207(水2 - sat 在圈内 还是 在圈外)

    题意: 就是一个圈上有n个点,给出m对个点,这m对个点,每一对都有一条边,合理安排这些边在圈内或圈外,能否不相交 解析: 我手残 我手残 我手残 写一下情况 只能是一个在圈外 一个在圈内 即一个1一个 ...

随机推荐

  1. java 中的匿名内部类

    转自http://www.cnblogs.com/nerxious/archive/2013/01/25/2876489.html 匿名内部类也就是没有名字的内部类 正因为没有名字,所以匿名内部类只能 ...

  2. Custom Control

    How to create custom control http://www.silverlightshow.net/items/Creating-a-Silverlight-Custom-Cont ...

  3. 1009. Product of Polynomials (25)

    #include <stdio.h> struct MyStruct { int exp; double coe; }; int main() { int k1,k2,i,j; MyStr ...

  4. [转]JAVA布局模式:GridBagConstraints终极技巧

    最近正在 修改<公交线路查询系统>,做系统的时候都是用NULL布局,由于NULL布局调用windows系统的API,所以生成的程序无法在其他平台上应用,而 且如果控件的数量很多,管理起来也 ...

  5. MySQL Partition分区扫盲

    MySQL从5..3开始支持Partition,你可以使用如下命令来确认你的版本是否支持Partition: mysql> SHOW VARIABLES LIKE '%partition%'; ...

  6. wampserver安装后的基本配置

    wampserver安装后的基本配置 1.WampServer的安装 下载好安装包后,你能在保存其文件夹中找到这样一个图标: 双击它,会弹出如下提示 提示信息:不要试图从Wamp5 1.x(x代表任意 ...

  7. windows2003 64位 iis6.0 运行32位web应用程序

    适用于已安装.NET4.0的windows 2003 64位机器. 系统要求: windows 2003 sp1 步骤: 1. 打开命令行,转到目录: %systemdrive%\Inetpub\Ad ...

  8. iPhone 7-b

    iPhone 7就要出了!据悉,苹果秋季新品发布会将于9月7日举行,大家来看看iPhone7的概念设计有多逆天. 新机一出,大家最关心的都是价格问题,那就一起看看大家关注的价格问题: 4.7寸的iPh ...

  9. UINavigationBar导航栏相关设置

    设置导航颜色 [[UINavigationBar appearance] setBarTintColor:[UIColor colorWithRed:0 green:0 blue:0 alpha:1] ...

  10. 用JavaScript获取页面上被选中的文字的技巧

    这里介绍的一个小技巧是如何用JavaScript获取页面上被选中的文字的方法.最关键的JavaScript API是: event.selection = window.getSelection(); ...