输出方案的2-sat

直接比较两个点强联通分量的编号,缩完点的图应该是有向无环图,根据原始做法是反图topsort出解,编号小的说明顺序在后,选择这个点符合定义。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;struct node
{int x,y,next;
}a[8100000];int len,last[2100];
void ins(int x,int y)
{len++;a[len].x=x;a[len].y=y;a[len].next=last[x];last[x]=len;
}
int z,dfn[2100],low[2100];
int top,sta[2100];bool v[2100];
int cnt,bel[2100];
void SCC(int x)
{dfn[x]=low[x]=++z;sta[++top]=x;v[x]=true;for(int k=last[x];k;k=a[k].next){int y=a[k].y;if(dfn[y]==0){SCC(y);low[x]=min(low[x],low[y]);}else if(v[y]==true)low[x]=min(low[x],dfn[y]);}if(low[x]==dfn[x]){int k;cnt++;do{k=sta[top];top--;v[k]=false;bel[k]=cnt;}while(k!=x);}
}int n;char ss[10];
struct point{int st,ed;}p[2100];
int sc()
{scanf("%s",ss+1);int slen=strlen(ss+1);int k1=0,k2=0,i=1;while(ss[i]!=':') k1=k1*10+ss[i]-'0',i++;i++;while(i<=slen)k2=k2*10+ss[i]-'0',i++;return k1*60+k2;
}
void pr(int g)
{if(g/60<10)printf("0");printf("%d",g/60);printf(":");g%=60;if(g<10)printf("0");printf("%d",g);
}
bool together(point p1,point p2)
{if(p1.st>p2.st)swap(p1,p2);return p1.ed<=p2.st;
}
void conposition()
{bool b1,b2;for(int i=1;i<=n;i++)for(int j=1;j<=n;j++) if(i!=j){b1=together(p[i],p[j]),b2=together(p[i],p[j+n]);if(!b1&&!b2)ins(i,i+n);else if(!b1)ins(i,j+n);else if(!b2)ins(i,j);b1=together(p[i+n],p[j]),b2=together(p[i+n],p[j+n]);if(!b1&&!b2)ins(i+n,i);else if(!b1)ins(i+n,j+n);else if(!b2)ins(i+n,j);}
}int w[1100];
int main()
{scanf("%d",&n); int st,ed,L;for(int i=1;i<=n;i++){st=sc(),ed=sc(),scanf("%d",&L);p[i].st=st,p[i].ed=st+L;p[i+n].st=ed-L,p[i+n].ed=ed;}conposition();z=top=cnt=0;for(int i=1;i<=2*n;i++)if(dfn[i]==0)SCC(i);for(int i=1;i<=n;i++){if(bel[i]==bel[i+n]){printf("NO\n");return 0;}w[i]=bel[i]>bel[i+n];}printf("YES\n");for(int i=1;i<=n;i++){if(w[i]==0)pr(p[i].st),printf(" "),pr(p[i].ed);elsepr(p[i+n].st),printf(" "),pr(p[i+n].ed);printf("\n");}return 0;
}

转载于:https://www.cnblogs.com/AKCqhzdy/p/9540913.html

poj3683 Priest John's Busiest Day相关推荐

  1. 【2-SAT初学+模板题讲解】POJ3683 Priest John's Busiest Day

    什么是2-SAT? SAT是适定性(Satisfiability)问题的简称 .一般形式为k-适定性问题,简称 k-SAT. 可以证明,当k>2时,k-SAT是NP完全的.因此一般讨论的是k=2 ...

  2. [题解]POJ 3683 Priest John's Busiest Day

    [Description] John is the only priest in his town. September 1st is the John's busiest day in a year ...

  3. LA 4328 Priest John's Busiest Day (Greedy)

    https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...

  4. POJ - 3683 Priest John's Busiest Day(2-SAT+路径打印)

    题目链接:点击查看 题目大意:现在有n对新人要结婚,每一场婚礼都要请牧师主持一个特殊的仪式,这个仪式必须在婚礼的前d分钟或者最后d分钟进行,现在问能否有一种安排,能让牧师参加到每一场婚礼去主持仪式,输 ...

  5. POJ 3683 Priest John's Busiest Day(2-ST)

    题目链接:http://poj.org/problem?id=3683 题意:有n个婚礼要举行,但是只有一个牧师.第i个婚礼使用牧师的时间长为leni,可以在开始时或结束时使用.问能否使得n个婚礼均举 ...

  6. pku 3683 Priest John's Busiest Day 2-sat判断有误解+输出可行解

    http://poj.org/problem?id=3683 题意: 一个教父,在一天中要给n对新婚夫妇举行婚礼.已知每对夫妇举行婚礼的起始时间Si和终止时间Ti ,教父送祝福的时间要么在Si-> ...

  7. POJ 3683 Priest John's Busiest Day (算竞进阶习题)

    2-SAT 可以把每一次仪式看成变量,0/1的取值分别为开头举行和结尾举行. 转换为2-SAT接受的命题,就是看某一次仪式中有没有重合的时间段,有的话,就按照不冲突的形式连有向边. 然后跑tarjan ...

  8. POJ 3683 Priest John's Busiest Day

    2-SAT简单题,判断一下两个开区间是否相交 #include<cstdio> #include<cstring> #include<cmath> #include ...

  9. 图论 —— 2-SAT 问题

    [问题概述] 2-SAT问题是这样的:有n个布尔变量xi,另有m个需要满足的条件,每个条件的形式都是"xi为真/假或者xj为真/假" SAT 是适定性(Satisfiability ...

最新文章

  1. java日期加减秒_Java日期——年、月、日、时、分、秒、周加减计算
  2. LeetCode--single-number复杂度
  3. 教你玩转CSS 提示工具(Tooltip)
  4. 从0到1写RT-Thread内核——临界段的保护
  5. R 读取excel的方法
  6. mongodb python 大于_5、Python操作MongoDB
  7. 项目管理应该注意问题
  8. 有基础学python看什么书好_python入门学习看什么书好,有什么书籍推荐
  9. fastadmin上传视频的操作
  10. 单循环赛制php,告别东西部分组LPL实行常规赛单循环赛制
  11. Wxpython pannel切换
  12. 中粮、益海品牌集中度提高,中小米企机会在高端细分市场
  13. java jini dll_java - Jini / JavaSpaces发现错误 - 堆栈内存溢出
  14. 零基础了解Https-https的安全策略
  15. 项目中采用J2EE体系架构分析
  16. python3**2的值,线性回归中的R*2平方值
  17. 时序约束——2 时钟约束(生成时钟)
  18. Symfony 框架优势
  19. 有赞 mysql go agent_有赞数据库服务实践
  20. vb.net 教程 12-4 msHtml 1

热门文章

  1. 51单片机开发板(W25Q16学习)
  2. windows下 sbulime text 安装less2css踩的几个坑
  3. 第 1 章 第 6 题 带重复数排序问题( 扩展 ) 位向量实现
  4. asp.net C# 时间格式大全
  5. 14 | 深入解析Pod对象(一):基本概念
  6. 【老王来了】之隔壁路由器坏了,他来了...
  7. 怎么做应力应变曲线_做冲压材质分析很重要,材料性能分析汇总~
  8. python使用ddt_python使用ddt模块对用例执行操作
  9. app启动页数秒加载 代码_干货 | App 自动化测试痛点(弹框及首页启动加载完成判断处理)
  10. 【超详细】一文学会链表解题(建议收藏!)