题目

John is the only priest in his town. September 1st is the John's busiest day in a year because there is an old legend in the town that the couple who get married on that day will be forever blessed by the God of Love. This year N couples plan to get married on the blessed day. The i-th couple plan to hold their wedding from time Si to time Ti. According to the traditions in the town, there must be a special ceremony on which the couple stand before the priest and accept blessings. The i-th couple need Di minutes to finish this ceremony. Moreover, this ceremony must be either at the beginning or the ending of the wedding (i.e. it must be either from Si to Si + Di, or from Ti - Di to Ti). Could you tell John how to arrange his schedule so that he can present at every special ceremonies of the weddings.

Note that John can not be present at two weddings simultaneously.

输入格式

The first line contains a integer N ( 1 ≤ N ≤ 1000).

The next N lines contain the Si, Ti and Di. Si and Ti are in the format of hh:mm.

输出格式

The first line of output contains "YES" or "NO" indicating whether John can be present at every special ceremony. If it is "YES", output another N lines describing the staring time and finishing time of all the ceremonies.

输入样例

2

08:00 09:00 30

08:15 09:00 20

输出样例

YES

08:00 08:30

08:40 09:00

题解

2-sat + 输出方案

对于每一个婚礼,有两个时间段可以选择,对应两个点

对于每两个婚礼,如果其中两个时间段t1和t1'相交,那么这两个时间段冲突,连边t1->t2',t1'->t2

跑一遍tarjan缩点,若存在婚礼的两个时间段处于同一个强联通分量,则无解

否则输出方案:

QAQ蒟蒻知道有两种方法:

①拓扑排序

将缩完点后的图反向建边,按拓扑顺序访问,每访问到一个没有染色的点,就染为第一种颜色,并令其对应点【对称的那个强两桶分量缩的点】及对应点延伸出去能到达的所有点染另一种颜色【一次dfs】

②按Scc编号

很神奇的方法,所有点对中,输出Scc编号较小的那个即可。。。【比拓扑简单多了 → →】

证明【假的】:tarjan缩点时拓扑序大的先缩,则编号较小,然而我们需要选择拓扑序大的,因为拓扑大的不会推出拓扑序小的

选择一个喜欢方法就可以A了> <

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#define LL long long int
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
#define BUG(s,n) for (int i = 1; i <= (n); i++) cout<<s[i]<<' '; puts("");
using namespace std;
const int maxn = 2005,maxm = 2000005,INF = 1000000000;
inline int read(){
int out = 0,flag = 1; char c = getchar();
while (c < 48 || c > 57) {if (c == '-') flag = -1; c = getchar();}
while (c >= 48 && c <= 57) {out = (out << 3) + (out << 1) + c - '0'; c = getchar();}
return out * flag;
}
int n,m,h[maxn],ne = 1;
struct EDGE{int to,nxt;}ed[maxm];
inline void build(int u,int v){
ed[ne] = (EDGE){v,h[u]}; h[u] = ne++;
}
int dfn[maxn],low[maxn],Scc[maxn],scci = 0,cnt = 0,st[maxn],top = 0;
void dfs(int u){
dfn[u] = low[u] = ++cnt;
st[++top] = u;
Redge(u)
if (!dfn[to = ed[k].to])
dfs(to),low[u] = min(low[u],low[to]);
else if (!Scc[to]) low[u] = min(low[u],dfn[to]);
if (dfn[u] == low[u]){
scci++;
do{
Scc[st[top]] = scci;
}while (st[top--] != u);
}
}
int B[maxn],T[maxn],ans[maxn],inde[maxn];
void print(int x){
printf("%02d:%02d ",x / 60,x % 60);
}
bool judge(int u,int v){
if (T[u] <= B[v] || B[u] >= T[v]) return false;
return true;
}
int main(){
n = read(); int a,b,t;
for (int i = 1; i <= n; i++){
a = read(); b = read(); B[2 * i - 1] = a * 60 + b;
a = read(); b = read(); T[2 * i] = a * 60 + b;
t = read();
T[2 * i - 1] = B[2 * i - 1] + t;
B[2 * i] = T[2 * i] - t;
}
for (int i = 1; i <= n; i++)
for (int j = i + 1; j <= n; j++){
if (judge(2 * i,2 * j))
build(2 * i,2 * j - 1),build(2 * j,2 * i - 1);
if (judge(2 * i,2 * j - 1))
build(2 * i,2 * j),build(2 * j - 1,2 * i - 1);
if (judge(2 * i - 1,2 * j))
build(2 * i - 1,2 * j - 1),build(2 * j,2 * i);
if (judge(2 * i - 1,2 * j - 1))
build(2 * i - 1,2 * j),build(2 * j - 1,2 * i);
}
for (int i = 1; i <= (n << 1); i++) if (!dfn[i]) dfs(i);
bool flag = true;
for (int i = 1; i <= n; i++) if (Scc[2 * i] == Scc[2 * i - 1]){
flag = false; break;
}
if (!flag) puts("NO");
else {
puts("YES");
for (int i = 1; i <= n; i++)
if (Scc[2 * i] < Scc[2 * i - 1])
print(B[2 * i]),print(T[2 * i]),puts("");
else print(B[2 * i - 1]),print(T[2 * i - 1]),puts("");
}
return 0;
}

POJ3683 Priest John's Busiest Day 【2-sat】的更多相关文章

  1. POJ3683 Priest John's Busiest Day(2-SAT)

    Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 11049   Accepted: 3767   Special Judge ...

  2. poj3683 Priest John's Busiest Day

    2-SAT 输出可行解 找可行解的方案就是: 根据第一次建的图建一个反图..然后求逆拓扑排序,建反图的原因是保持冲突的两个事件肯定会被染成不同的颜色 求逆拓扑排序的原因也是为了对图染的色不会发生冲突, ...

  3. poj3683 Priest John's Busiest Day

    2-SAT. 读入用了黄学长的快速读入,在此膜拜感谢. 把每对时间当作俩个点.如果有交叉代表相互矛盾. 然后tarjan缩点,这样就能得出当前的2-SAT问题是否有解. 如果有解,跑拓扑排序就能找出一 ...

  4. POJ 3683 Priest John's Busiest Day 【2-Sat】

    这是一道裸的2-Sat,只要考虑矛盾条件的判断就好了. 矛盾判断: 对于婚礼现场 x 和 y,x 的第一段可以和 y 的第一段或者第二段矛盾,同理,x 的第二段可以和 y 的第一段或者第二段矛盾,条件 ...

  5. poj 3683 Priest John's Busiest Day【2-SAT+tarjan+拓扑】

    转换成2-SAT模型,建边是如果时间(i,j)冲突就连边(i,j'),其他同理 tarjan缩点,判可行性 返图拓扑,输出方案 #include<iostream> #include< ...

  6. UVA1420 Priest John's Busiest Day【贪心】

    题意简介 有一个司仪,要主持n场婚礼,给出婚礼的起始时间和终止时间,每个婚礼需要超过一半的时间做为仪式,并且仪式不能终止.问说司仪能否主持n场婚礼. 输入格式 多组数据,每组数据输入一个\(N\)(\ ...

  7. 【POJ3683】Priest John's Busiest Day

    题目 John is the only priest in his town. September 1st is the John's busiest day in a year because th ...

  8. 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 ...

  9. 图论(2-sat):Priest John's Busiest Day

    Priest John's Busiest Day   Description John is the only priest in his town. September 1st is the Jo ...

随机推荐

  1. 深入理解计算机系统_3e 第十章家庭作业 CS:APP3e chapter 10 homework

    10.6 1.若成功打开"foo.txt": -->1.1若成功打开"baz.txt": 输出"4\n" -->1.2若未能成功 ...

  2. ASP.NET 与 Ajax 的实现方式

    Ajax 应该不是一项技术,是一种思想而已,跟 ASP.NET 以及其它 Web 开发语言没有什么太大关系,这里只是谈谈 ASP.NET 中目前使用的 Ajax 技术以及其它一些实现 Ajax 的优秀 ...

  3. 如何利用WordPress的菜单功能实现友情链接功能?

    导语:对于wordpress网站的友情链接,有很多种方法可以实现,例如我们可以利用WordPress的链接功能,或者利用WordPress的菜单功能.本文章介绍的是如何利用菜单功能来实现友情链接. 前 ...

  4. 操作系统(6)_虚拟存储管理_李善平ppt

    image含各种段. 有些不需要的页可能永远不需要装入内存,可能只有百分之70-80是异常情况采用的,这种代码就可以放入硬盘. 抖动实际就是进程数太多导致内存不够用造成的. 页面换入换出在内存和磁盘之 ...

  5. D-bus交叉编译

    在嵌入式中如果需要Qt系统支持U盘插拔,则需要Qt支持D-bus. D-bus的交叉编译依赖expat库,此库为XML解析库. 交叉编译expat库: #./configure --host=XXX ...

  6. Linux更改文件权限(二)

    更改文件权限(二)============================== (参考于千锋教育教学笔记) 命令umask [root@aminglinux ~]# umask 0022 [root@ ...

  7. HTML5/CSS3 第三章页面布局

    页面布局 1 页面组成 2 布局相关的标签 <div></div> 定义文档中的分区或节 <span></span> 这是一个行内元素,没有任何意义 & ...

  8. ATM-interface-bank

    from lib import commonfrom db import db_handler user_logger = common.get_logger('bank') def check_ba ...

  9. web前端使用localstorage、sessionstorage、cookie增删获方法

    今天主要的学习内容是cookie与本地储存的知识, 在HTML5中,本地存储是一个window的属性,包括localStorage和sessionStorage,从名字应该可以很清楚的辨认二者的区别, ...

  10. Linux常见的系統进程

    前言 在日常运维工作中,经常会看到一些奇怪的系统进程占用资源比较高.而且总是会听到业务线同学询问“xxx这个是啥进程啊?咋开启了这么多?” 而这些系统级的内核进程都是会用中括号括起来的,它们会执行一些 ...