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

Description

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.

Input

The first line contains a integer N ( 1 ≤ N ≤ 1000). 
The next N lines contain the SiTi and DiSi and Ti are in the format of hh:mm.

Output

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.

Sample Input

2
08:00 09:00 30
08:15 09:00 20

Sample Output

YES
08:00 08:30
08:40 09:00

Source

题意:

 
题意:有一个小镇上只有一个牧师。这个小镇上有一个传说,在九月一日结婚的人会受到爱神的保佑,但是要牧师举办一个仪式。这个仪式要么在婚礼刚刚开始的时候举行,要么举行完婚礼正好结束。 现在已知有n场婚礼,告诉你每一场的开始和结束时间,以及举行仪式所需要的时间。问牧师能否参加所有的婚礼,如果能则输出一种方案。
 
对于每一场婚礼,我们可以把它抽象成一个点对
对于冲突的点,我们可以看做是利用选A不能选B的关系来进行限制
这样这道题就变成了一道2-SAT问题
然后按照套路用tarjan缩点,暴力建反向图,拓扑排序
 
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
#include<vector>
#include<queue>
#define Pair pair<int,int>
#define F first
#define S second
using namespace std;
const int MAXN=1e6+;
//#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin),p1==p2)?EOF:*p1++)
char buf[<<],*p1=buf,*p2=buf;
inline int read()
{ char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
Pair P[MAXN];
bool check(int x,int y)
{
if((P[x].S<=P[y].F)||(P[x].F>=P[y].S)) return ;
else return ;
}
struct node
{
int u,v,nxt;
}edge[MAXN];
int head[MAXN],num=;
inline void AddEdge(int x,int y)
{
edge[num].u=x;
edge[num].v=y;
edge[num].nxt=head[x];
head[x]=num++;
}
int dfn[MAXN],low[MAXN],vis[MAXN],color[MAXN],colornum=,tot;
stack<int>s;
void tarjan(int now)
{
dfn[now]=low[now]=++tot;
vis[now]=;
s.push(now);
for(int i=head[now];i!=-;i=edge[i].nxt)
{
if(!dfn[edge[i].v])
tarjan(edge[i].v),low[now]=min(low[now],low[edge[i].v]);
else if(vis[edge[i].v])
low[now]=min(low[now],dfn[edge[i].v]);
}
if(dfn[now]==low[now])
{
int h;colornum++;
do
{
h=s.top();s.pop();
color[h]=colornum;
vis[h]=;
}while(h!=now);
}
}
vector<int>E[MAXN];
int enemy[MAXN],inder[MAXN],ans[MAXN];
void Topsort()
{
queue<int>q;
for(int i=;i<=colornum;i++)
if(inder[i]==)
q.push(i);
while(q.size()!=)
{
int p=q.front();q.pop();
if(!ans[p]) ans[p]=,ans[enemy[p]]=-;
for(int i=;i<E[p].size();i++)
{
inder[E[p][i]]--;
if(inder[E[p][i]]==) q.push(E[p][i]);
}
}
}
int main()
{
#ifdef WIN32
freopen("a.in","r",stdin);
#else
#endif
memset(head,-,sizeof(head));
int N=read();
for(int i=;i<=N;i++)
{
int a,b,c,d,len;
scanf("%d:%d %d:%d %d",&a,&b,&c,&d,&len);
P[i].F=a*+b;
P[i].S=a*+b+len;
P[i+N].F=c*+d-len;
P[i+N].S=c*+d;
}
for(int i=;i<=N;i++)
{
for(int j=;j<=N;j++)
{
if(i==j) continue;
if(check(i,j)) AddEdge(i,j+N);
if(check(i,j+N)) AddEdge(i,j);
if(check(i+N,j)) AddEdge(i+N,j+N);
if(check(i+N,j+N)) AddEdge(i+N,j);
}
}
for(int i=;i<=N;i++)
if(!dfn[i])
tarjan(i);
for(int i=;i<=N;i++)
if(color[i]==color[i+N])
{printf("NO\n");return ;}
printf("YES\n");
for(int i=;i<=N;i++)
enemy[color[i]]=color[i+N],
enemy[color[i+N]]=color[i];
for(int i=;i<=N<<;i++)
{
for(int j=head[i];j!=-;j=edge[j].nxt)
{
if(color[i]!=color[edge[j].v])
{
E[color[edge[j].v]].push_back(color[i]);
inder[color[i]]++;
}
}
}
Topsort();
for(int i=;i<=N;i++)
{
if(ans[color[i]]==)
printf("%.2d:%.2d %.2d:%.2d\n",P[i].F/,P[i].F%,P[i].S/,P[i].S%);
else
printf("%.2d:%.2d %.2d:%.2d\n",P[i+N].F/,P[i+N].F%,P[i+N].S/,P[i+N].S%);
}
return ; }
 
 

POJ3683 Priest John's Busiest Day(2-SAT)的更多相关文章

  1. POJ3683 Priest John's Busiest Day 【2-sat】

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

  2. poj3683 Priest John's Busiest Day

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

  3. poj3683 Priest John's Busiest Day

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

  4. 【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 ...

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

  6. 图论(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 ...

  7. poj 3686 Priest John's Busiest Day

    http://poj.org/problem?id=3683 2-sat 问题判定,输出一组可行解 http://www.cnblogs.com/TheRoadToTheGold/p/8436948. ...

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

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

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

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

随机推荐

  1. iTerm2 使用笔记

    iTerm2 使用了1年多了,一些功能其实还没有主动去发现,这次接着项目忙完的空闲时间整理一下tips,提高工作效率,方便以后查阅. 一.几个术语 从小到大:session > pane > ...

  2. ubuntu 16.04 下安装NVDIA的库(CUDA+CUDNN)

    立志学习神经网络的同学,为了让它能够跑快一点,估计英伟达的GPU是要折腾一番的. 首先看一下什么是CUDA ? CUDA(Compute Unified Device Architecture),是显 ...

  3. 【PHP篇】输出方法

    php开始处加:error_reporting(E_ALL & ~E_NOTICE);  //不打印注意 echo: echo “字符串”;   //也可为单引号 echo $变量名; ech ...

  4. session的一些笔记

    HttpSession hs = request.getSession();//以键值对方式存储数据在session中hs.setAttribute("code", code);/ ...

  5. Android--UI之Fragment

    前言 开门见山开篇名义,本篇博客将讲解一下Android中Fragment的内容,必要的地方会提供相应的演示代码,并且会在最后给出源码下载. 本文主要有以下内容: 什么是Fragment 如何创建一个 ...

  6. 物流一站式查询之TrackingMore篇

    连载篇提前看 物流一站式查询之TrackingMore篇 物流一站式查询之顺丰接口篇 物流一站式查询之快递100篇 快递查询接口 目前提供快递查询的接口平台有: Trackingmore 快递100 ...

  7. Poi 生成xls

    来首小诗: 今日不胜昨日寒,我却把那拖鞋穿,脚儿冰冰秋风瑟,抬头一看碧蓝天.         ---泥沙砖瓦浆木匠 项目需求: p2p项目中,需要一些数据报表一xls的格式,提供下载.并给主管签名. ...

  8. 【HDFS API编程】第一个应用程序的开发-创建文件夹

    /** * 使用Java API操作HDFS文件系统 * 关键点: * 1)创建 Configuration * 2)获取 FileSystem * 3)...剩下的就是 HDFS API的操作了*/ ...

  9. 使用 AcceptTcpClientAsync 进行 异步 操作

    转自:https://gist.github.com/jamesmanning/2622054 using System; using System.Collections.Generic; usin ...

  10. Java生成sitemap网站地图

    访问我的博客 sitemap 是什么?对应没有接触过网站 SEO 的同学可能不知道,这里引用一下百度站长的一段解释. Sitemap(即站点地图)就是您网站上各网页的列表.创建并提交Sitemap有助 ...