POJ3207+tarjan+2-sat
/*
2-sat
题意:给定一个圆,圆上一些点。两点一线。现给出一些线,这些线可以在圆内连起来,也可以在圆外。
问有没有可能所有的线画完 且 不出现相交。
思路:把线画在圆内或圆外 看成一个组合。其它的则建边。
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
#include<iostream>
#include<set>
#include<stack>
#include<queue>
#include<map>
#include<vector>
using namespace std; typedef long long int64;
//typedef __int64 int64;
typedef pair<int64,int64> PII;
#define MP(a,b) make_pair((a),(b))
const int maxn = ;
const int maxm = ;
const int inf = 0x7fffffff;
const double pi=acos(-1.0);
const double eps = 1e-; struct Edge{
int u,v,next;
}edge[ maxm*+ ];
int cnt,head[ maxn ];
int vis[ maxn ];
int dfn[ maxn ],low[ maxn ];
int belong[ maxn ],Cnt,id;
stack<int>s;
struct EDGE{
int l,r;
}E[ maxn ]; void init(){
id = Cnt = ;
cnt = ;
while( !s.empty() )
s.pop();
memset( head,-,sizeof( head ) );
memset( vis,-,sizeof( vis ) );
memset( dfn,-,sizeof( dfn ) );
memset( low,-,sizeof( low ) );
} void addedge( int a,int b ){
edge[ cnt ].u = a;
edge[ cnt ].v = b;
edge[ cnt ].next = head[ a ];
head[ a ] = cnt++;
} bool ok( int L,int R ){
int x1 = E[L].l;
int y1 = E[L].r;
int x2 = E[R].l;
int y2 = E[R].r;
if( x2>x1&&x2<y1 ){
if( y2>=y1 ) return true;
if( y2<=x1 ) return true;
}
if( y2>x1&&y2<y1 ){
if( x2>=y1 ) return true;
if( x2<=x1 ) return true;
}
return false;
} void tarjan( int cur ){
dfn[ cur ] = low[ cur ] = id++;
vis[ cur ] = ;
s.push( cur );
for( int i=head[ cur ];i!=-;i=edge[i].next ){
int nxt = edge[ i ].v;
if( dfn[ nxt ]==- ){
tarjan( nxt );
low[ cur ] = min( low[ cur ],low[ nxt ] );
}
else if( vis[ nxt ]== ){
low[ cur ] = min( low[ cur ],dfn[ nxt ] );
}
}
if( dfn[ cur ]==low[ cur ] ){
Cnt ++;
while( ){
int tmp = s.top();
s.pop();
vis[ tmp ] = ;
belong[ tmp ] = Cnt;
if( tmp==cur ) break;
}
}
} int main(){
int n,m;
while( scanf("%d%d",&n,&m)== ){
init();
int a,b;
for( int i=;i<=m;i++ ){
scanf("%d%d",&a,&b);
a++,b++;
E[ i ].l = min( a,b );
E[ i ].r = max( a,b );
}
for( int i=;i<=m;i++ ){
for( int j=i+;j<=m;j++ ){
if( ok( i,j )==true ){
addedge( i,j+m );
addedge( j+m,i );
addedge( i+m,j );
addedge( j,i+m );
}
}
}//build mat
for( int i=;i<=*m;i++ ){
if( dfn[i]==- ){
tarjan( i );
}
}
//
bool f = true;
for( int i=;i<=m;i++ ){
if( belong[i]==belong[i+m] ){
f = false;
break;
}
}
if( f==false ) printf("the evil panda is lying again");
else printf("panda is telling the truth...");
printf("\n");
}
return ;
}
POJ3207+tarjan+2-sat的更多相关文章
- poj3207:Ikki's Story IV-Panda's Trick【2-sat tarjan】
题目大意:圆盘上顺次安放0, 1, 2, …, n – 1的点,每次给出两个点需要连边,可以选择在圆盘的正面连边或在圆盘的反面连边,问是否存在一种方案使得所有连线不相交? 思路:本问题可以等价成:圆盘 ...
- 学习笔记(two sat)
关于two sat算法 两篇很好的论文由对称性解2-SAT问题(伍昱), 赵爽 2-sat解法浅析(pdf). 一些题目的题解 poj 3207 poj 3678 poj 3683 poj 3648 ...
- HIT 1917 2—SAT
题目大意:一国有n个党派,每个党派在议会中都有2个代表, 现要组建和平委员会,要从每个党派在议会的代表中选出1人,一共n人组成和平委员会. 已知有一些代表之间存在仇恨,也就是说他们不能同时被选为和平委 ...
- HDU4738 tarjan割边|割边、割点模板
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4738 坑点: 处理重边 图可能不连通,要输出0 若求出的结果是0,则要输出1,因为最少要派一个人 #inc ...
- bzoj 1179[Apio2009]Atm (tarjan+spfa)
题目 输入 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i条道路的起点和终点的路口编号.接下来N行,每行一 ...
- tarjan讲解(用codevs1332(tarjan的裸题)讲解)
主要借助这道比较裸的题来讲一下tarjan这种算法 tarjan是一种求解有向图强连通分量的线性时间的算法.(用dfs来实现) 如果两个顶点可以相互通达,则称两个顶点强连通.如果有向图G的每两个顶点都 ...
- NOIP2009最优贸易[spfa变形|tarjan 缩点 DP]
题目描述 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个 城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分 为双向通行的道路 ...
- Tarjan
//求强连通分量 void uni(int x,int y){ if (rank[x]<rank[y]){ fa[x]=y; size[y]+=size[x]; }else{ rank[x]+= ...
- 【UOJ#67】新年的毒瘤 Tarjan 割点
#67. 新年的毒瘤 UOJ直接黏贴会炸... 还是戳这里吧: http://uoj.ac/problem/67#tab-statement Solution 看到这题的标签就进来看了一眼. 想 ...
随机推荐
- <转载>提升程序的特权(AdjustTokenPrivileges)
首先列出需要的函数 1.OpenProcessToken 2.AdjustTokenPrivileges 3. LookupPrivilegeValue ----------------------- ...
- 使用WDS安装Windows8.1
WDS的部署 安装角色 配置 1. 选择配置服务器 2. 核对是否满足要求 3. 输入远程安装文件夹的路径 4. 选择是否使用自带的DHCP服务器 5. 可以保持默认 6. 完成配置后添加映像文件 7 ...
- 实例介绍Cocos2d-x中Box2D物理引擎:使用关节
下面我们将使用Box2D物理引擎技术进行重构.使得关节能够掌握如何在Box2D使用关节约束.HelloWorldScene.cpp中与使用关节的相关代码如下: void HelloWorld::add ...
- IOS 图片全屏预览
如果你感觉累,那就对了那是因为你在走上坡路..这句话似乎有点道理的样子,时常提醒自己无论走到哪都不要忘记自己当初为什么出发.有时想想感觉有的东西可以记录一下,就把它记录下来吧,这次想写一下关于单张图片 ...
- iMAC——全新重装Mac系统
在参考网上重装Mac系统教程的时候,感觉这篇教程挺不错: http://www.iplaysoft.com/osx-yosemite-usb-install-drive.html (此教程终端命令处需 ...
- javascript笔记——placehold
<input type="text" name="搜索" value="搜索" placeholder="搜索" ...
- 2013山东省“浪潮杯”省赛 A.Rescue The Princess
A.Rescue The PrincessDescription Several days ago, a beast caught a beautiful princess and the princ ...
- 解决Scala异常处理java.lang.OutOfMemoryError: Java heap space error
需求:百万.千万.4千万级日志对设备进行除重环境:设备内存64G,scala单机版运行shell文件日志:20G 48000000.log4.0G 10000000.log396M 1000000.l ...
- 译文:javascript function中的this
个人理解+google翻译.如有错误,请留言指正.原文来自MDN: this 简介 Javascript中一个函数的this关键字的行为相对其它语言有些不同.在严格模式和非严格模式间也有区别. 在大多 ...
- coreseek安装使用
本文引自:http://www.phperz.com/article/14/0615/95.html sphinx的安装使用,其实都是大同小异,以下以 coreseek安装为例Coreseek 是一款 ...