http://poj.org/problem?id=3683

2-sat 问题判定,输出一组可行解

http://www.cnblogs.com/TheRoadToTheGold/p/8436948.html

注:

本代码在判断两个时间段部分有误,数据弱A了

#include<cstdio>
#include<vector> using namespace std; #define N 1001 struct TIME
{
int h1,m1;
int h2,m2;
int tim;
}e[N]; int n;
int tot; int front[N<<],to[N*N*],nxt[N*N*]; int dfn[N<<],low[N<<];
int st[N<<],top;
bool vis[N<<]; int cnt;
int id[N<<];
vector<int>V[N<<]; int FRONT[N<<],TO[N*N*],NXT[N*N*],TOT;
int in[N<<]; bool use[N<<],cut[N<<]; struct ANS
{
int h1,m1;
int h2,m2;
}ans[N]; void add(int u,int v)
{
to[++tot]=v; nxt[tot]=front[u]; front[u]=tot;
} void ADD(int u,int v)
{
TO[++TOT]=v; NXT[TOT]=FRONT[u]; FRONT[u]=TOT;
in[v]++;
} bool judge(int h1s,int m1s,int h1t,int m1t,int h2s,int m2s,int h2t,int m2t)
{
int s1=(h1s-)*+m1s;
int t1=(h1t-)*+m1t;
int s2=(h2s-)*+m2s;
int t2=(h2t-)*+m2t;
if(s1<=s2)
{
if(s2>=t1) return false;
return true;
}
else
{
if(t2<=s1) return false;
return true;
}
} void tarjan(int u)
{
dfn[u]=low[u]=++tot;
st[++top]=u;
vis[u]=true;
for(int i=front[u];i;i=nxt[i])
{
if(!dfn[to[i]])
{
tarjan(to[i]);
low[u]=min(low[u],low[to[i]]);
}
else if(vis[to[i]]) low[u]=min(low[u],dfn[to[i]]);
}
if(dfn[u]==low[u])
{
cnt++;
while(st[top]!=u)
{
id[st[top]]=cnt;
vis[st[top]]=false;
V[cnt].push_back(st[top--]);
}
id[u]=cnt;
vis[u]=false;
V[cnt].push_back(u);
top--;
}
} void rebuild()
{
for(int k=;k<=n;++k)
{
int i=k<<;
for(int j=front[i];j;j=nxt[j])
if(id[i]!=id[to[j]]) ADD(id[to[j]],id[i]);
i=k<<|;
for(int j=front[i];j;j=nxt[j])
if(id[i]!=id[to[j]]) ADD(id[to[j]],id[i]);
}
} void out(int h,int m)
{
if(m> && m<) printf("%02d:%02d",h,m);
else if(m<)
{
if(!(m%))
{
h+=m/;
printf("%02d:00",h);
}
else
{
h+=m/;
h--;
m%=;
if(m<) m+=;
printf("%02d:%02d",h,m);
}
}
else
{
h+=m/;
m%=;
printf("%02d:%02d",h,m);
}
} void topsort()
{
for(int i=;i<=cnt;++i)
if(!in[i]) st[++top]=i;
int u,v;
while(top)
{
u=st[top--];
if(cut[u]) continue;
use[u]=true;
v=id[V[u][]^];
cut[v]=true;
for(int i=FRONT[u];i;i=NXT[i])
{
in[TO[i]]--;
if(!in[TO[i]]) st[++top]=TO[i];
}
//for(int i=FRONT[v];i;i=NXT[i]) cut[TO[i]]=true;
}
for(int i=;i<=n;++i)
if(use[id[i<<]])
{
ans[i].h1=e[i].h1;
ans[i].m1=e[i].m1;
ans[i].h2=e[i].h1;
ans[i].m2=e[i].m1+e[i].tim;
}
else
{
ans[i].h1=e[i].h2;
ans[i].m1=e[i].m2-e[i].tim;
ans[i].h2=e[i].h2;
ans[i].m2=e[i].m2;
}
puts("YES");
for(int i=;i<=n;++i)
{
out(ans[i].h1,ans[i].m1);
putchar(' ');
out(ans[i].h2,ans[i].m2);
putchar('\n');
}
} int main()
{
scanf("%d",&n);
for(int i=;i<=n;++i)
{
scanf("%d:%d",&e[i].h1,&e[i].m1);
scanf("%d:%d",&e[i].h2,&e[i].m2);
scanf("%d",&e[i].tim);
}
for(int i=;i<n;++i)
for(int j=i+;j<=n;++j)
if(i!=j)
{
if(judge(e[i].h1,e[i].m1,e[i].h1,e[i].m1+e[i].tim,e[j].h1,e[j].m1,e[j].h1,e[j].m1+e[j].tim))
add(i<<,j<<|),add(j<<,i<<|);
if(judge(e[i].h1,e[i].m1,e[i].h1,e[i].m1+e[i].tim,e[j].h2,e[j].m2-e[j].tim,e[j].h2,e[j].m2))
add(i<<,j<<),add(j<<|,i<<|);
if(judge(e[i].h2,e[i].m2-e[i].tim,e[i].h2,e[i].m2,e[j].h1,e[j].m1,e[j].h1,e[j].m1+e[j].tim))
add(i<<|,j<<|),add(j<<,i<<);
if(judge(e[i].h2,e[i].m2-e[i].tim,e[i].h2,e[i].m2,e[j].h2,e[j].m2-e[j].tim,e[j].h2,e[j].m2))
add(i<<|,j<<),add(j<<|,i<<);
}
tot=;
for(int i=;i<=n;++i)
{
if(!dfn[i<<]) tarjan(i<<);
if(!dfn[i<<|]) tarjan(i<<|);
}
for(int i=;i<=n;++i)
if(id[i<<]==id[i<<|])
{
puts("NO");
return ;
}
rebuild();
topsort();
}
Priest John's Busiest Day
Time Limit: 2000MS   Memory Limit: 65536K
Total Submissions: 11007   Accepted: 3759   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

poj 3686 Priest John's Busiest Day的更多相关文章

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

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

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

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

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

  4. POJ 3683 Priest John's Busiest Day(2-SAT 并输出解)

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

  5. poj - 3683 - Priest John's Busiest Day(2-SAT)

    题意:有N场婚礼,每场婚礼的开始时间为Si,结束时间为Ti,每场婚礼有个仪式,历时Di,这个仪式要么在Si时刻开始,要么在Ti-Di时刻开始,问能否安排每场婚礼举行仪式的时间,使主持人John能参加所 ...

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

    题意:有n对新人要在同一天结婚.结婚时间为Ti到Di,这里有时长为Si的一个仪式需要神父出席.神父可以在Ti-(Ti+Si)这段时间出席也可以在(Di-Si)-Si这段时间.问神父能否出席所有仪式,如 ...

  7. POJ 3683 Priest John's Busiest Day (2-SAT,常规)

    题意: 一些人要在同一天进行婚礼,但是牧师只有1个,每一对夫妻都有一个时间范围[s , e]可供牧师选择,且起码要m分钟才主持完毕,但是要么就在 s 就开始,要么就主持到刚好 e 结束.因为人数太多了 ...

  8. POJ 3683 Priest John's Busiest Day

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

  9. POJ 3683 Priest John's Busiest Day[2-SAT 构造解]

    题意: $n$对$couple$举行仪式,有两个时间段可以选择,问是否可以不冲突举行完,并求方案 两个时间段选择对应一真一假,对于有时间段冲突冲突的两人按照$2-SAT$的规则连边(把不冲突的时间段连 ...

随机推荐

  1. Tomcat 基础二

    1.Tomcat 实现了一个新的Servlet容器Catalina: 2.Tomcat:         ROOT         |         |____      /             ...

  2. 写个发邮件的功能php的(全代码)

    ---恢复内容开始--- 正好做了个项目,需要在线留言,一般在线留言发邮件是很常见的方式,一开始从网上搜了很久都没有很全的,也有全一点的,但是也不能用,运行不成功,下面给大家分享一下运行成功了的全部代 ...

  3. SpringBoot整合Mybatis之进门篇

    已经有好些日子没有总结了,不是变懒了,而是我一直在奋力学习springboot的路上,现在也算是完成了第一阶段的学习,今天给各位总结总结. 之前在网上找过不少关于springboot的教程,都是一些比 ...

  4. Js_特效II

    字号缩放 让文字大点,让更多的用户看的更清楚.(也可以把字体变为百分比来实现)<script type="text/javascript">  function doZ ...

  5. numpy 初识(二)

    针对 numpy.array(序列)的实例介绍 ndim 数组(矩阵)的维度 size 所有元素的和 数学运算(+, -) 元素个数一样,对应位置相减 加,减,乘,平方一个数,执行广播形式:即都减去一 ...

  6. Jmeter(十九)_ForEach控制器实现网页爬虫

    一直以来,爬虫似乎都是写代码去实现的,今天像大家介绍一下Jmeter如何实现一个网页爬虫! 龙渊阁测试开发家园 317765580 Jmeter的爬虫原理其实很简单,就是对网页提交一个请求,然后把返回 ...

  7. 关于Unity物理事件的执行顺序的最新理解

    物体A: public class A:{ B b; void FixedUpdate(){ if(input.GetKeyDow(Keycode.I)) { collider.enable=fals ...

  8. Java收发邮件过程中具体的功能是怎么实现的

    SMTP协议 用户连上邮件服务器后,要想给它发送一封电子邮件,需要遵循一定的通迅规则,SMTP协议就是用于定义这种通讯规则的. 因而,通常我们也把处理用户smtp请求(邮件发送请求)的邮件服务器称之为 ...

  9. c# WndProc事件 消息类型

    转载:https://www.cnblogs.com/idben/p/3783997.html WM_NULL = 0x0000; WM_CREATE = 0x0001;应用程序创建一个窗口 WM_D ...

  10. @PathVariable获取带点参数,获取不全

    {account:.+}在{account}后加上:.+ 可参考原博:http://blog.csdn.net/jrainbow/article/details/46126179