博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CodeForces 27D - Ring Road 2 构图2-sat..并输出选择方案
阅读量:6536 次
发布时间:2019-06-24

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

 

    题意
            n个数1~n按顺序围成一个圈...现在在某些两点间加边..边可以加在圈内或者圈外..问是否会发生冲突?如果不发生冲突..输每一条边是放圈内还是圈外.
    题解
            这道题和POJ 3207差不多了..只是那道题只要判断是否存在不要输出方案...发现个很严重的问题..POJ 3207的数据实在是太弱了..我上一个程序里判断两个线段是否相交是个错了..都让我AC了..导致我做这题是沿用了思路...浪费了很多时间...
            先把每条线段看成一个组连个点..圈外和圈内..然后根据线段的冲突关系构造2-sat图..用tarjan做强联通分量判断是否存在方案使得每个线段都不冲突..并且将每个强联通分量缩成一个点,..若存在方案..开始找方案..将缩点后的图构造好..得到的会是一个有向无环图(要是有环那两个强联通分量就应该合并了..所以无环)..按照拓扑排序从入度为0的点进入...对到达的点染色(也就是标记)..并且将对应的一些点也染色(就是同一组的另一个,标记为另一个颜色)...最后根据染色输出每条边的内外..

 

 

Program:

 

#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long#define oo 1000000007#define pi acos(-1.0)#define MAXN 205using namespace std; struct node{ int x,y;}line[MAXN];vector
T[MAXN];int dfn[MAXN],low[MAXN],DfsIndex,tpnum,tp[MAXN],color[MAXN];bool instack[MAXN],arc[MAXN][MAXN],d[MAXN];stack
mystack;bool ok(int a,int b){ if (line[a].y>line[b].x && line[a].y
=line[b].x && line[a].x<=line[b].y)) return false; if (line[a].x>line[b].x && line[a].x
=line[b].x && line[a].y<=line[b].y)) return false; return true;}void tarjan(int x){ int i,y,m=T[x].size(); dfn[x]=low[x]=++DfsIndex; instack[x]=true; mystack.push(x); for (i=0;i
y) t=x,x=y,y=t; line[i].x=x,line[i].y=y; } for (i=0;i<(m<<1);i++) T[i].clear(); for (i=0;i

 

 

转载地址:http://enbdo.baihongyu.com/

你可能感兴趣的文章
解决 Jsp_Servlet 编码乱码问题
查看>>
PHP7扩展开发之Hello World
查看>>
Linux基础
查看>>
第三章 请求与响应
查看>>
垃圾收集器与内存分配策略
查看>>
看视频学Bootstrap—在微软虚拟学院学习Bootstrap
查看>>
【多重背包】CDOJ1691 这是一道比CCCC简单题经典的中档题
查看>>
【贪心】Codeforces Round #423 (Div. 1, rated, based on VK Cup Finals) A. String Reconstruction
查看>>
【强联通分量缩点】【Tarjan】bzoj1051 [HAOI2006]受欢迎的牛
查看>>
Java class反编译的方法总结
查看>>
全局变量和局部变量
查看>>
code forces 436 D. Make a Permutation!
查看>>
Problem L
查看>>
本地测试Web项目方法
查看>>
服务器被攻击,黑客的操作
查看>>
Linux常用命令之链接命令和权限管理命令
查看>>
函数式编程
查看>>
php 错误堆栈
查看>>
完全卸载删除gitlab
查看>>
给单元素艺术添加动画
查看>>