题目:
题意:
给出圆上的n个点,某些点之间有连线,连线可以从圆内也可以从圆外连,问是否存在一种方案使所有的连线不相交(相交在圆上的除外)。
这题目还真是难理解,如果从圆外连就是曲线啊
题解:
可行性问题,两种选择:圆内和圆外
那么两条线相交的可能就是简单的二者有交集
代码:
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int N=1000;
int tot,nxt[N*N],point[N],v[N*N],dfn[N],low[N],stack[N],top,id,nn,belong[N],x[N],y[N];
bool vis[N];
void addline(int x,int y){++tot; nxt[tot]=point[x]; point[x]=tot; v[tot]=y;}
void tarjan(int x)
{
low[x]=dfn[x]=++nn; vis[x]=1; stack[++top]=x;
for (int i=point[x];i;i=nxt[i])
if (!dfn[v[i]])
{
tarjan(v[i]);
low[x]=min(low[x],low[v[i]]);
}
else if (vis[v[i]]) low[x]=min(low[x],dfn[v[i]]);
if (low[x]==dfn[x])
{
int now=0;id++;
while (now!=x)
{
now=stack[top--];
vis[now]=0;
belong[now]=id;
}
}
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for (int i=1;i<=m;i++)
{
scanf("%d%d",&x[i],&y[i]);
if (x[i]>y[i]) swap(x[i],y[i]);
}
for (int i=1;i<=m;i++)
for (int j=i+1;j<=m;j++)
if ((x[i]<x[j] && y[i]<y[j] && x[j]<y[i])||(x[i]>x[j] && y[i]>y[j] && x[i]<y[j]))
{addline(i,j+m); addline(j,i+m); addline(i+m,j); addline(j+m,i);}
for (int i=1;i<=m*2;i++)
if (!dfn[i]) tarjan(i);
for (int i=1;i<=m;i++)
if (belong[i]==belong[i+m])
{printf("the evil panda is lying again");return 0;}
printf("panda is telling the truth...");
}