/*
2sat问题
输出任意一组可行解
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
#define N 2100
struct node {
int u,v,next;
}ff[N],bian[N*N*8];
int head[N],yong,low[N],dfn[N],belong[N],ans,top,index,stac[N],vis[N];
void init()
{
memset(head,-1,sizeof(head));
yong=index=ans=top=0;
memset(vis,0,sizeof(vis));
memset(dfn,0,sizeof(dfn));
}
void addedge(int u,int v)
{
bian[yong].u=u;//有的时候不能少,因为下面要用到
bian[yong].v=v;
bian[yong].next=head[u];
head[u]=yong++;
}
void tarjan(int u)
{
low[u]=dfn[u]=++index;
stac[++top]=u;
vis[u]=1;
int i;
for(i=head[u]; i!=-1; i=bian[i].next)
{
int v=bian[i].v;
if(!dfn[v])
{
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(vis[v])
low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u])
{
ans++;
int t;
do
{
t=stac[top--];
belong[t]=ans;
vis[t]=0;
}
while(t!=u);
}
}
int slove(int n)
{
int i;
for(i=0; i<n*2; i++)
if(!dfn[i])
tarjan(i);
// printf("%d\n",ans);
for(i=0; i<n; i++)
if(belong[i]==belong[i+n])
return 0;
return 1;
}
int judge(struct node a,struct node b) {
if(a.v<=b.u||b.v<=a.u)
return 0;
return 1;
}
int fp[N],indegree[N],color[N];
vector<int>q[N];
void print(struct node a) {
printf("%02d:%02d %02d:%02d\n",a.u/60,a.u%60,a.v/60,a.v%60);
}
void oper(int n) {
int i;
for(i=0;i<n;i++) {
fp[belong[i]]=belong[i+n];
fp[belong[i+n]]=belong[i];
}
for(i=1;i<=ans;i++) {
q[i].clear();
color[i]=0;
indegree[i]=0;
}
for(i=0;i<yong;i++) {
int aa=bian[i].u;
int bb=bian[i].v;
if(belong[aa]!=belong[bb]) {
q[belong[bb]].push_back(belong[aa]);
indegree[belong[aa]]++;
}
}
queue<int>qq;
for(i=1;i<=ans;i++) {
if(indegree[i]==0)
qq.push(i);
}
while(!qq.empty()) {
int cur=qq.front();
qq.pop();
if(color[cur]==0) {
color[cur]=1;
color[fp[cur]]=2;
}
for(i=0;i<(int)q[cur].size();i++) {
int v=q[cur][i];
if(--indegree[v]==0)
qq.push(v);
}
}
for(i=0;i<n;i++) {
if(color[belong[i]]==1)
print(ff[i]);
else
print(ff[i+n]);
}
}
int main() {
int n,i,j,k,u,v,uu,vv,d;
while(scanf("%d",&n)!=EOF) {
for(i=0;i<n;i++) {
scanf("%d:%d %d:%d%d",&u,&v,&uu,&vv,&d);
j=u*60+v;
k=uu*60+vv;
ff[i].u=j;ff[i].v=j+d;
ff[i+n].u=k-d;ff[i+n].v=k;
}
init();
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++) {
if(judge(ff[i],ff[j])) {
addedge(i,j+n);
addedge(j,i+n);
}
if(judge(ff[i],ff[j+n])) {
addedge(i,j);
addedge(j+n,i+n);
}
if(judge(ff[i+n],ff[j])) {
addedge(i+n,j+n);
addedge(j,i);
}
if(judge(ff[i+n],ff[j+n])) {
addedge(i+n,j);
addedge(j+n,i);
}
}
if(!slove(n)) {
printf("NO\n");
continue;
}
printf("YES\n");
oper(n);
}
return 0;}

poj 3683 2-sat问题,输出任意一组可行解的更多相关文章

  1. 2-sat 输出任意一组可行解&拓扑排序+缩点 poj3683

    Priest John's Busiest Day Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8170   Accept ...

  2. HDU 1507 Uncle Tom's Inherited Land*(二分匹配,输出任意一组解)

    Uncle Tom's Inherited Land* Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (J ...

  3. 洛谷 P4174 [NOI2006]最大获利 && 洛谷 P2762 太空飞行计划问题 (最大权闭合子图 && 最小割输出任意一组方案)

    https://www.luogu.org/problemnew/show/P4174 最大权闭合子图的模板 每个通讯站建一个点,点权为-Pi:每个用户建一个点,点权为Ci,分别向Ai和Bi对应的点连 ...

  4. poj 3648 2-sat 输出任意一组解模板

    转载地址:http://blog.csdn.net/qq172108805/article/details/7603351 /* 2-sat问题,题意:有对情侣结婚,请来n-1对夫妇,算上他们自己共n ...

  5. POJ 3683 Priest John&#39;s Busiest Day (2-SAT+输出可行解)

    题目地址:POJ 3683 第一次做须要输出可行解的题目. . .大体思路是先用强连通来推断是否有可行解,然后用逆序建图.用拓扑排序来进行染色.然后输出可行解. 详细思路见传送门 由于推断的时候少写了 ...

  6. POJ 3683 Priest John's Busiest Day (2-SAT)

    Priest John's Busiest Day Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6900   Accept ...

  7. poj 3683(2-sat+输出一组可行解)

    题目链接:http://poj.org/problem?id=3683 思路:对于每个结婚仪式,只有在开始或结束时进行这两种选择,我们可以定义xi为真当且仅当在开始时进行.于是我们可以通过时间先后确定 ...

  8. POJ 3683 Priest John's Busiest Day(2-SAT+方案输出)

    Priest John's Busiest Day Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10010   Accep ...

  9. POJ 3683 Priest John's Busiest Day / OpenJ_Bailian 3788 Priest John's Busiest Day(2-sat问题)

    POJ 3683 Priest John's Busiest Day / OpenJ_Bailian 3788 Priest John's Busiest Day(2-sat问题) Descripti ...

随机推荐

  1. 前端之CSS创建的样式

    CSS即层叠样式表,在创建时有以下几种样式: 1.内联样式(行内样式.行间样式): <标记 style=“属性:属性值:”></标记> 2.内部样式(嵌入式样式): <s ...

  2. 正则表达式中的?=,?!,?<=,?<!(预查)解释小栗子

    之前在学正则表达式的时候学的并不是很透彻 感觉看看元字符(元字符要用 \ 转义),限定符(^开头 $结尾),   前面写个范围[a-z],在后面写个{n,}能匹配就行了 当时的自己 然而昨天我参加了个 ...

  3. resharper10 注册方法

    注册工具:http://pan.baidu.com/s/1bnFjGfX 注册方法: 1 编辑Products.json文件,留下自己要注册的产品路径即可. 2 运行patch.exe 3 使用Ser ...

  4. itop安装中使用nginx安装后不能出现enter itop的问题

    安装中没有出现enter itop,  如下的网络请求给了我们原因 原来使用的是域名请求资源文件,而该域名并不能指向我的服务器,所以安装中资源文件请求不成功,查看了我的nginx配置,如下 [ro ...

  5. Android(java)学习笔记185:多媒体之设置全屏的方法

    在实际的应用程序开发中,我们有时需要把 Activity 设置成全屏显示,一般情况下,可以通过两种方式来设置全屏显示效果.其一,通过在代码中可以设置,其二,通过manifest配置文件来设置全屏. 其 ...

  6. 光线步进——RayMarching入门

    入门实现 先用RayMarching描绘一个球体,最后在进行光照计算参考:https://www.shadertoy.com/view/llt3R4 模拟摄像机射线float3 rayDirectio ...

  7. JavaScript/JQuery radioButton(单选按钮)练习20190409

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  8. DNS查询过程

    DNS查询过程 假设www.abc.com的主机要查询www.xyz.abc.com的服务器ip地址. 知识点 1.hosts文件:以静态映射的方式提供IP地址与主机名的对照表,类似ARP表 2.域: ...

  9. 高德地图api之location定位

    关于定位,分为GPS定位和网络定位.本文将详细描述的浏览器定位,属于网络定位.这是一种通过使用高德JS-API来实现位置定位.城市定位的方法,包含了IP定位,检索等多种网络定位方式.如果您的手机支持G ...

  10. encodeURI()与decodeURI()等转码方法

    只针对文本编码 encodeURI() 只针对文本解码 decodeURI()针对文本和特殊字符的编码  encodeURIComponent()针对文本和特殊字符的解码  decodeURIComp ...