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

來源:互聯網
上載者:User

標籤:poj   oi   acm   2-sat   

Ikki‘s Story IV - Panda‘s Trick
Time Limit: 1000MS   Memory Limit: 131072K
Total Submissions: 8175   Accepted: 3011

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

POJ Monthly--2007.03.04, Ikki

2-SAT判斷可行性模板題。


題意是:

給出一個圓,給出m個點,點與點之間有連線,連線可在圓內或圓外、可直可彎曲。問這些線段能否不想交。


連線在圓內或圓外,對於有兩種選擇的問題,考慮2-SAT。


不能在同時在圓內或圓外的情況:

兩個點與另外兩個點的連線同在圓內或同在圓外時會交叉



#include <iostream>#include <cstdio>#include <algorithm>#include <cstdlib>#include <cmath>#include <stack>#include <cstring>using namespace std;int tot=0,n,m,a[5000],b[5000],h[5000],pre[5000],lowlink[5000],dfs_clock=0,scc_cnt=0,sccno[5000];stack<int> s;struct edge{int y,ne;}e[1000000];void Add(int x,int y){tot++;e[tot].ne=h[x];e[tot].y=y;h[x]=tot;}void dfs(int u){pre[u]=lowlink[u]=++dfs_clock;s.push(u);for (int i=h[u];i;i=e[i].ne){int v=e[i].y;if (!pre[v]){dfs(v);lowlink[u]=min(lowlink[v],lowlink[u]);}else if (!sccno[v])lowlink[u]=min(lowlink[u],pre[v]);}if (lowlink[u]==pre[u]){scc_cnt++;for (;;){int x=s.top();s.pop();sccno[x]=scc_cnt;if (x==u) break;}}}void Findscc(){dfs_clock=scc_cnt=0;memset(pre,0,sizeof(pre));memset(sccno,0,sizeof(sccno));for (int i=1;i<=2*m;i++)if (!pre[i]) dfs(i);}int main(){    scanf("%d%d",&n,&m);for (int i=1;i<=m;i++){scanf("%d%d",&a[i],&b[i]);if (a[i]>b[i]) swap(a[i],b[i]);}for (int i=1;i<=m;i++)for (int j=i+1;j<=m;j++)if ((a[i]<a[j]&&b[i]<b[j]&&b[i]>a[j])||(a[i]>a[j]&&b[i]>b[j]&&a[i]<b[j]))  //不能同時在圓內或圓外{Add(i,j+m);Add(i+m,j);Add(j,i+m);Add(j+m,i);}Findscc();for (int i=1;i<=m;i++)if (sccno[i]==sccno[i+m]) {printf("the evil panda is lying again\n");return 0;}printf("panda is telling the truth...\n");return 0;}




感悟:

1.CE是標頭檔忘了打<cstring>

RE是存邊的數組開太小!!


2.2-SAT的問題關鍵在於發現二者選其一是哪二者,是哪些之間要二者選其一。

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.