[POJ 3683]Priest Johns Busiest Day
一、题目
点此看题
二、解法
如果在开始时进行婚礼,那么就定义它为真,否则它为假。
如果两个人在开始时冲突,那么至少一个人需要选择在结束时,也就是x′∨y′x'\vee y'x′∨y′,其他情况类推
然后2-sat\text{2-sat}2-sat,时间主要是建图,时间复杂度O(n2)O(n^2)O(n2),坑点就是时间相等时是合法的。
#include <cstdio>
#include <iostream>
#include <stack>
using namespace std;
const int M = 2005;
int read()
{int num=0,flag=1;char c;while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;while(c>='0'&&c<='9')num=(num<<3)+(num<<1)+(c^48),c=getchar();return num*flag;
}
int n,m,tot,Index,cnt,s[M],t[M],d[M];
int f[M],dfn[M],low[M],in[M],col[M];
stack<int> st;
struct edge
{int v,next;
}e[M*M];
void add(int u,int v)
{e[++tot]=edge{v,f[u]},f[u]=tot;
}
void tarjan(int u)
{in[u]=1;st.push(u);dfn[u]=low[u]=++Index;for(int i=f[u];i;i=e[i].next){int v=e[i].v;if(!dfn[v])tarjan(v),low[u]=min(low[u],low[v]);else if(in[v])low[u]=min(low[u],dfn[v]);}if(low[u]==dfn[u]){int v=0;cnt++;do{v=st.top();st.pop();in[v]=0;col[v]=cnt;}while(v!=u);}
}
int check(int l1,int r1,int l2,int r2)
{return !(l1>=r2 || l2>=r1);
}
void work(int i,int j,int va,int vb)
{add(i+n*(va&1),j+n*(vb^1));add(j+n*(vb&1),i+n*(va^1));
}
signed main()
{n=read();for(int i=1;i<=n;i++){int w,x,y,z;scanf("%d:%d %d:%d %d",&w,&x,&y,&z,&d[i]);s[i]=60*w+x;t[i]=60*y+z;}for(int i=1;i<=n;i++)for(int j=1;j<i;j++){int va=0,vb=0;if(check(s[i],s[i]+d[i],s[j],s[j]+d[j]))work(i,j,0,0);if(check(s[i],s[i]+d[i],t[j]-d[j],t[j]))work(i,j,0,1);if(check(t[i]-d[i],t[i],s[j],s[j]+d[j]))work(i,j,1,0);if(check(t[i]-d[i],t[i],t[j]-d[j],t[j]))work(i,j,1,1);}for(int i=1;i<=2*n;i++)if(!dfn[i])tarjan(i);for(int i=1;i<=n;i++)if(col[i]==col[i+n]){puts("NO");return 0;}puts("YES");for(int i=1;i<=n;i++){if(col[i]<col[i+n]){int h1=s[i]/60,r1=s[i]%60;s[i]+=d[i];int h2=s[i]/60,r2=s[i]%60;printf("%02d:%02d %02d:%02d\n",h1,r1,h2,r2);}else{int h1=t[i]/60,r1=t[i]%60;t[i]-=d[i];int h2=t[i]/60,r2=t[i]%60;printf("%02d:%02d %02d:%02d\n",h2,r2,h1,r1);}}
}
[POJ 3683]Priest Johns Busiest Day相关推荐
- [题解]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 ...
- POJ 3683 Priest John's Busiest Day(2-ST)
题目链接:http://poj.org/problem?id=3683 题意:有n个婚礼要举行,但是只有一个牧师.第i个婚礼使用牧师的时间长为leni,可以在开始时或结束时使用.问能否使得n个婚礼均举 ...
- POJ - 3683 Priest John's Busiest Day(2-SAT+路径打印)
题目链接:点击查看 题目大意:现在有n对新人要结婚,每一场婚礼都要请牧师主持一个特殊的仪式,这个仪式必须在婚礼的前d分钟或者最后d分钟进行,现在问能否有一种安排,能让牧师参加到每一场婚礼去主持仪式,输 ...
- POJ 3683 Priest John's Busiest Day (算竞进阶习题)
2-SAT 可以把每一次仪式看成变量,0/1的取值分别为开头举行和结尾举行. 转换为2-SAT接受的命题,就是看某一次仪式中有没有重合的时间段,有的话,就按照不冲突的形式连有向边. 然后跑tarjan ...
- POJ 3683 Priest John's Busiest Day
2-SAT简单题,判断一下两个开区间是否相交 #include<cstdio> #include<cstring> #include<cmath> #include ...
- pku 3683 Priest John's Busiest Day 2-sat判断有误解+输出可行解
http://poj.org/problem?id=3683 题意: 一个教父,在一天中要给n对新婚夫妇举行婚礼.已知每对夫妇举行婚礼的起始时间Si和终止时间Ti ,教父送祝福的时间要么在Si-> ...
- POJ 3683 【2-sat+求一组可行解】.cpp
题意: 有一个牧师要给好几对新婚夫妇准备婚礼.. 已知每对新婚夫妇的有空的时间以及婚礼持续时间.. 问是否可以让每对新婚夫妇都得到该牧师的祝福~ 如果可以就输出YES以及可行解 不可以就输出NO 输入 ...
- [2-sat专练]poj 3683,hdu 1814,hdu 1824,hdu 3622,hdu 4115,hdu 4421
文章目录 Priest John's Busiest Day code Peaceful Commission code Let's go home code Bomb Game code Elimi ...
- poj pku图论、网络流入门题总结、汇总
poj pku图论.网络流入门题总结.汇总 分类: acm图论 2010-08-25 18:49 243人阅读 评论(0) 收藏 举报 网络算法networkgraphconstructioninte ...
- POJ 图论分类 + DP(较全 自己又加了点)
DP -----------动态规划 状态压缩DP 2411 (棋盘规模较大)状态压缩DP+DFS+滚动数组 2664 (棋盘规模较小)直接递推即可(DP) 2506 (棋盘规模较小)直接递推即可(D ...
最新文章
- ASP.NET MVC动作过滤器
- 顺序表-给定的顺序表L中删除元素值在x到y(x<=y)之间的所有的元素
- 这篇文章说出了研究生和导师的相处真谛……
- 听歌识曲原理探究以及样例代码
- matlab四节点矩形单元的应变,四节点矩形单元有限元解读.ppt
- 1000 qps java,什么是QPS?
- php.exe php-cgi.exe php-win.exe的区别
- Filter 字符编码Filter 一
- Linux运维实战之DNS的高级配置(转发器、视图等)
- 联级阴影贴图CSM(Cascaded shadow map)原理与实现
- jquery easyui 多选下拉框的实现
- 2018批量打印开关_从阿迪达斯到国产品牌,感受3D打印技术掀起的运动鞋中底革命...
- linux 网络io 监控,Linux教程:Linux性能监控-NetworkIO
- nc数据处理,掩膜,经纬度定位格点
- java人民币大写_JAVA 数字转人民币大写
- 乔布斯2005的演讲
- console口设置登录密码
- [战略]对空间_日志风格_日志分类_日志标记_的整体说明
- vue 实现上拉加载下拉刷新(思路贼清晰)
- 点击添加Class active属性