博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 3207 Ikki's Story IV - Panda's Trick【2-SAT】
阅读量:6457 次
发布时间:2019-06-23

本文共 1665 字,大约阅读时间需要 5 分钟。

题意:已知一个圆上顺时针放着 n 个点,这 n 个点中有m对顶点之间有连线,连线要么在园外要么在圆内,每个点最多连接一条边,问是否存在一种连接情况满足所有的

        边都不相交。

分析:将每条边看成两个点 i ,i+m 分别表示边在内部和在外部,

        如果两条边i,j的端点存在序号上的交叉,则这两对点之间的连线一个在外部一个在内部

        即如果存在 i,则必存在 j+m ,如果存在 j ,则必存在 i+m,

           如果存在 i+m,则必存在 j ,如果存在 j+m ,则必存在 i,

       建图的时候连的边为

       i -> j+m

       j -> i+m

      i+m -> j

      j+m -> i

     求出强连通分量并染色,判断是否存在冲突的情况即可。

#include
#include
#define maxn 1100#define clr(x)memset(x,0,sizeof(x))#define min(a,b)(a)<(b)?(a):(b)#define max(a,b)(a)>(b)?(a):(b)struct Edg{ int u,v;}e[1100];struct node{ int to,next;}edge[1000000];int tot;int head[maxn];void add(int s,int t){ edge[tot].to=t; edge[tot].next=head[s]; head[s]=tot++;}int dfn[maxn];int low[maxn];int sta[maxn];int ins[maxn];int col[maxn];int top,sn,ti;void tarjan(int u){ dfn[u]=low[u]=++ti; sta[++top]=u; ins[u]=1; int i,k; for(i=head[u];i;i=edge[i].next) { k=edge[i].to; if(dfn[k]==0) { tarjan(k); low[u]=min(low[u],low[k]); } else if(ins[k]) low[u]=min(low[u],dfn[k]); } if(dfn[u]==low[u]) { sn++; do { k=sta[top--]; ins[k]=0; col[k]=sn; }while(k!=u); }}int main(){ int n,m,i,j; while(scanf("%d%d",&n,&m)!=EOF) { for(i=0;i
e[i].v) { int tmp=e[i].u; e[i].u=e[i].v; e[i].v=tmp; } } tot=1; clr(head); for(i=0;i
e[j].u&&e[i].v>e[j].v ||e[i].v>e[j].u&&e[i].v

 

转载于:https://www.cnblogs.com/dream-wind/archive/2012/09/29/2708492.html

你可能感兴趣的文章
Mysql免安装版的应用
查看>>
mysql innobackupex增量备份
查看>>
MyBatis缓存
查看>>
Kafka在zookeeper中的存储
查看>>
ah大婚,到底谁占到了便宜?
查看>>
copy_constructor 复制构造函数
查看>>
mysql主从同步原理+配置
查看>>
LockSupport的park和unpark的基本使用,以及对线程中断的响应性
查看>>
prometheus(version 2.0.0)系列之三
查看>>
redhat 配置xmanager
查看>>
为什么匿名内部类和局部内部类只能访问final变量
查看>>
day15:磁盘格式化和挂载
查看>>
centos7 安装docker
查看>>
js中的substr()与substring()方法的区别
查看>>
二进制相关
查看>>
Oracle Study之-AIX6.1构建Oracle 10gR2 RAC(1)
查看>>
放假回了
查看>>
Adb移植(一)简单分析
查看>>
Linux VNC server的安装及简单配置使用
查看>>
阿里宣布开源Weex ,亿级应用匠心打造跨平台移动开发工具
查看>>