题意:平面上,一个圆,圆的边上按顺时针放着n个点。现在要连m条边,比如a,b,那么a到b可以从圆的内部连接,也可以从圆的外部连接。给你的信息中,每个点最多只会连接的一条边。问能不能连接这m条边,使这些边都不相交。 题意可能刚开始不是很好理解,比如1 5连边,2,6连边,由于点是顺序排列的,一画图就可以发现,这两条边必须一个从圆外面连,一个从内部连,否则就会相交。如果再加入3 7这条边,那么就必须相交了。 这样,就可以转化成标准的2-SAT问题: 1:每个边看成2个点:分别表示在内部连接和在外部连接,只能选择一个。计作点i和点i' 2:如果两条边i和j必须一个画在内部,一个画在外部(一个简单判断就可以) 那么连边: i->j’, 表示i画内部的话,j只能画外部,即j’ j->i’,同理 i’->j,同理 j’->i,同理 然后就是2-sat算法了,tarjan一下,如果有i和i'同属于一个强联通,返回false,否则就成立。


#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MID(x,y) ((x+y)>>1)
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
const int MAXN = 1005;
const int MAXM = MAXN * MAXN;
struct links{int u, v;
}l[MAXN];
struct node{int u, v;int next;
}arc[MAXM];
int cnt, head[MAXN];
void init(){cnt = 0;mem(head, -1);return ;
}
void add(int u, int v){arc[cnt].u = u;arc[cnt].v = v;arc[cnt].next = head[u];head[u] = cnt ++;
}
/* ------------------------------ Tarjan ------------------------- */
int scc_num, scc[MAXN];
int scc_acount[MAXN];
int dfn[MAXN], low[MAXN], id;
stack  st;
bool vis[MAXN], instack[MAXN];
void dfs(int u){vis[u] = instack[u] = 1;st.push(u);dfn[u] = low[u] = ++ id;for (int i = head[u]; i != -1; i = arc[i].next){int v = arc[i].v;if (!vis[v]){dfs(v);low[u] = min(low[u], low[v]);}else if (instack[v]){low[u] = min(low[u], dfn[v]);}}if (low[u] == dfn[u]){++ scc_num;while(st.top() != u){scc[st.top()] = scc_num;scc_acount[scc_num] ++;instack[st.top()] = 0;st.pop();}scc_acount[scc_num] ++;scc[st.top()] = scc_num;st.pop();}return ;
}
void tarjan(int n){mem(scc_acount, 0);mem(vis, 0);mem(instack, 0);mem(dfn, 0);mem(low, 0);mem(scc, 0);id = scc_num = 0;while(!st.empty())st.pop();for (int i = 1; i <= n; i ++){   //枚举节点if (!vis[i])dfs(i);}return ;
}
/* ------------------------------ Tarjan ------------------------- *//* ------------------------------ 2-SAT -------------------------- */
void add_clause(int m){      //根据条件加边,不同题目具体分析init();for (int i = 1; i <= m; i ++){for (int j = i+1; j <= m; j ++){if ((l[i].u < l[j].u && l[i].v < l[j].v && l[j].u < l[i].v)|| l[i].u > l[j].u && l[i].v > l[j].v && l[i].u < l[j].v){//如果i,j矛盾,则选i必须选j'; 选i'必须选j;……//i+m表示i'; j+m表示j'add(i, j + m);add(i + m, j);add(j, i + m);add(j + m, i);}}}return ;
}
bool check(int m){          //2-SAT无解判定。m为2-SAT节点数tarjan(2*m);for (int i = 1; i <= m; i ++){if (scc[i] == scc[i+m]){return false;}}return true;
}
/* ------------------------------ 2-SAT -------------------------- */int main(){int n, m;scanf("%d %d", &n, &m);for (int i = 1; i <= m; i ++){scanf("%d %d", &l[i].u, &l[i].v);if (l[i].u > l[i].v)    swap(l[i].u, l[i].v);}add_clause(m);if (check(m)){puts("panda is telling the truth...");}else{puts("the evil panda is lying again");}return 0;
}

转载于:https://www.cnblogs.com/AbandonZHANG/archive/2013/06/06/4114030.html

POJ 3207 Ikki's Story IV - Panda's Trick (POJ 六道2-SAT之一)相关推荐

  1. poj 3207 Ikki's Story IV - Panda's Trick(2-SAT)

    题目链接:http://poj.org/problem?id=3207 思路分析:该问题给出N个点,并给出M条连接这些点的线,需要判断是否这些线不会相交: (1)假设两条线A的端点按照圆圈的顺时针方向 ...

  2. pku 3207 Ikki's Story IV - Panda's Trick 2-sat判定是否存在可行解

    http://poj.org/problem?id=3207 题意: 一个圆盘的边沿上有n个点, 下标从0开始, 有m条线连接2m个互不相同的点, 线可以在圆盘内部,也可以在圆盘外部, 要求任意两条线 ...

  3. POJ.3207.Ikki's Story IV-Panda's Trick(2-SAT)

    题目链接 \(Description\) 一个圆上顺序排列0,1,...,n-1共n个点,给出m条线段,线段可以从里面连也可以从外面连,问是否能满足所有线段不相交 \(Solution\) 把每条线段 ...

  4. 解题报告 poj 3207

    1.        题目 POJ 3207 2.        题目实质 平面上,一个圆,圆的边上按顺时针放着n个点.现在要连m条边,比如a,b,那么a到b可以从圆的内部连接,也可以从圆的外部连接.问 ...

  5. poj 3207 2-sat

    题目链接:http://poj.org/problem?id=3207 #include <cstdio> #include <cmath> #include <algo ...

  6. poj 3204 Ikki's Story I - Road Reconstruction

    最大流最小割 分析都在代码注释中 /* 题意:对于一个有向图的最大流,在每条流路中,只能修改一条边,使得修改后,整个网络的最大流可以增大,问有多少条这样的边 注意一点,在一条流路中只能修改一条,好像s ...

  7. poj pku图论、网络流入门题总结、汇总

    poj pku图论.网络流入门题总结.汇总 分类: acm图论 2010-08-25 18:49 243人阅读 评论(0) 收藏 举报 网络算法networkgraphconstructioninte ...

  8. POJ 图论分类 + DP(较全 自己又加了点)

    DP -----------动态规划 状态压缩DP 2411 (棋盘规模较大)状态压缩DP+DFS+滚动数组 2664 (棋盘规模较小)直接递推即可(DP) 2506 (棋盘规模较小)直接递推即可(D ...

  9. (转)2-sat 专题

    [2-sat]专题- 2-sat是一个逻辑性很强的算法,但是其套路比较固定,所以不是很热,题目很少,但也不乏AC后让人大呼爽快的好题,下面放出两篇极品论文还有几道题目的题解以供交流-- 2-sat学习 ...

最新文章

  1. dropbox解决办法
  2. mysql插10万条数据_MySQL数据库插入100w条数据要花多久?
  3. boost::edmonds_karp_max_flow用法的测试程序
  4. 利用truffle与智能合约进行交互
  5. 土地利用转移矩阵_ArcGIS_土地利用转移矩阵(对比2010年-2020年土地利用变化)...
  6. linux nfs iscsi,对比平台--iSCSI和NFS之间的区别
  7. Ubuntu创建快捷方式
  8. TCMPC进阶之路——accumulate函数应用
  9. 硅谷之火何时才能引燃中国的OS
  10. idea导入项目出现乱码
  11. 使用FusionChartsFree整合项目
  12. php 公众号调起小程序,微信公众号怎么跳转到小程序 微信公众号跳转到小程序方法介绍...
  13. 【滤波】一维卡尔曼滤波器
  14. “互联网+”时代下的服装企业管理
  15. 阿里云服务器4核8G配置CPU性能报价表
  16. 用Javascript开发《三国志曹操传》-开源讲座(四)-用地图块拼成大地图
  17. 在linux下怎么打包直接运行的node-webkit桌面应用
  18. [废弃]想写一个玩魔方的游戏
  19. eagle 中文教程
  20. 军工科研质量管理软件(RDM Military)全面支持GJB5000A

热门文章

  1. bme280 环境传感器开发板_盘一盘那些年我们常用的物联网开发板!
  2. JZOJ 1637. 【ZJOI2009】狼和羊的故事
  3. python输出假分数_分数的表示以及计算(c++)
  4. 小学用计算机画画 说课,小学教师说课稿:《画画美丽的自然景色》
  5. 20201125 《计算感知》武老师 第1节课 笔记
  6. 洛谷 P1206 [USACO1.2]回文平方数 Palindromic Squares
  7. ktor框架用到了netty吗_如何使用 Ktor 快速开发 Web 项目
  8. python自动访问网页_Python自动化 selenium 网页自动化-在访问一个网页时弹出的浏览器窗口,我该如何处理?...
  9. nginx动静分离配置_nginx动静分离实战
  10. hbase查询语句_Sqoop实操|Sqoop导入Parquet文件Hive查询为null问题