Ikki's Story IV - Panda's Trick (poj 3207 2-SAT)
来源:互联网 发布:阿里云学生认证被锁 编辑:程序博客网 时间:2024/06/05 15:04
Description
liympanda, one of Ikki’s friend, likes playing games with Ikki. Today after minesweeping with Ikki and winning so many times, he is tired of such easy games and wants to play another game with Ikki.
liympanda has a magic circle and he puts it on a plane, there are n points on its boundary in circular border: 0, 1, 2, …, n − 1. Evil panda claims that he is connecting m pairs of points. To connect two points, liympanda either places the link entirely inside the circle or entirely outside the circle. Now liympanda tells Ikki no two links touch inside/outside the circle, except on the boundary. He wants Ikki to figure out whether this is possible…
Despaired at the minesweeping game just played, Ikki is totally at a loss, so he decides to write a program to help him.
Input
The input contains exactly one test case.
In the test case there will be a line consisting of of two integers: n and m (n ≤ 1,000, m ≤ 500). The following m lines each contain two integers ai and bi, which denote the endpoints of the ith wire. Every point will have at most one link.
Output
Output a line, either “panda is telling the truth...
” or “the evil panda is lying again
”.
Sample Input
4 20 13 2
Sample Output
panda is telling the truth...
Source
题意:有n个点在一个圆上,标号0~n-1,有m条线段告诉两个端点的标号,每条线段可以在画在圆内也可以画在圆外,问这m条线段能否不向交。
思路:2-SAT模板题,把每条线段当做节点,每条线有两种状态(圆内和圆外,两者只能取其一),建图后求强连通,看 i 和 i‘ 是否在同一个连通分量,若在则无解,否则有解。
参考:由对称性解2-SAT问题 还有 kuangbin神牛的总结点击打开链接
代码:
#include <iostream>#include <functional>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <string>#include <map>#include <stack>#include <vector>#include <set>#include <queue>#pragma comment (linker,"/STACK:102400000,102400000")#define pi acos(-1.0)#define eps 1e-6#define lson rt<<1,l,mid#define rson rt<<1|1,mid+1,r#define FRE(i,a,b) for(i = a; i <= b; i++)#define FREE(i,a,b) for(i = a; i >= b; i--)#define FRL(i,a,b) for(i = a; i < b; i++)#define FRLL(i,a,b) for(i = a; i > b; i--)#define mem(t, v) memset ((t) , v, sizeof(t))#define sf(n) scanf("%d", &n)#define sff(a,b) scanf("%d %d", &a, &b)#define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c)#define pf printf#define DBG pf("Hi\n")typedef long long ll;using namespace std;#define INF 0x3f3f3f3f#define mod 1000000009const int maxn = 1005;const int MAXN = 2005;const int MAXM = 200010;const int N = 1005;struct Edge{ int to,next;}edge[MAXM];int head[MAXN],tot;void init(){ tot=0; memset(head,-1,sizeof(head));}void addedge(int u,int v){ edge[tot].to=v; edge[tot].next=head[u]; head[u]=tot++;}int Low[MAXN],DFN[MAXN],Stack[MAXN],Belong[MAXN];int Index,scc,top;bool Instack[MAXN];void Tarjan(int u){ int v; Low[u]=DFN[u]=++Index; Stack[top++]=u; Instack[u]=true; for (int i=head[u];~i;i=edge[i].next) { v=edge[i].to; if (!DFN[v]) { Tarjan(v); if (Low[u]>Low[v]) Low[u]=Low[v]; } else if (Instack[v]&&Low[u]>DFN[v]) Low[u]=DFN[v]; } if (Low[u]==DFN[u]) { ++scc; do{ v=Stack[--top]; Instack[v]=false; Belong[v]=scc; }while (v!=u); } return ;}bool solvable(int n){ memset(DFN,0,sizeof(DFN)); memset(Instack,false,sizeof(Instack)); Index=scc=top=0; for (int i=0;i<n;i+=2) if (!DFN[i]) Tarjan(i); for (int i=0;i<n;i+=2) { if (Belong[i]==Belong[i^1]) return false; } return true;}struct Line{ int s,t;}line[MAXN];int n,m;int main(){#ifndef ONLINE_JUDGE freopen("C:/Users/lyf/Desktop/IN.txt","r",stdin);#endif int i,j; scanf("%d%d",&n,&m); init(); for (i=0;i<m;i++) { scanf("%d%d",&line[i].s,&line[i].t); if (line[i].s>line[i].t) swap(line[i].s,line[i].t); } for (i=0;i<m;i++) { for (j=i+1;j<m;j++) { if (line[i].s<line[j].s&&line[i].t>line[j].s&&line[i].t<line[j].t||line[j].s<line[i].s&&line[j].t>line[i].s&&line[j].t<line[i].t) { addedge(2*i,2*j+1); addedge(2*j+1,2*i); addedge(2*j,2*i+1); addedge(2*i+1,2*j); } } } if (solvable(m*2)) printf("panda is telling the truth...\n"); else printf("the evil panda is lying again\n"); return 0;}
- poj 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
- 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+建图
- 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)
- 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判断)
- 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,4级)
- 2-sat->poj 3207 Ikki's Story IV - Panda's Trick
- 2-sat 问题学习小记 Poj 3207 Ikki's Story IV - Panda's Trick (可行性判定)
- [poj 3207] Ikki\'s Story IV - Panda\'s Trick(2-sat or 并查集)
- 二叉树的先序,中序,后序遍历 c语言
- (4.1.29.1)Android 操作SQLite基本用法之SQLiteOpenHelper
- jquery 回车事件
- poj 3254 种玉米 状压dp
- hdu 1025 Constructing Roads In JGShining's Kingdom(最长上升子序列nlogn算法)
- Ikki's Story IV - Panda's Trick (poj 3207 2-SAT)
- 积跬步,聚小流------Bootstrap学习记录(2)
- Android属性之build.prop生成过程分析
- 利用双缓冲消除图片重画的闪烁现象
- leetCode #232 Implement Queue using Stacks
- Git Stash用法,方便临时处理bug时随时切换分支而不丢失修改
- construct express
- python生成随机用户名及密码方法
- leetcode 111 —— Minimum Depth of Binary Tree