link

题目大意

有$n$个时间安排,可以安排到$2$个时间,问是否可以将时间错开,若能,输出一种方案。

试题分析

$O(n^2)$暴力判断两者是否能在同一个时间安排,若有两段时间$(u,v)$是不能安排在一起的,则连边$(u,v'),(v,u')$,然后就一个彻彻底底是一个板子了。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
inline int read(){int f=1,ans=0;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){ans=ans*10+c-'0';c=getchar();}return f*ans;
}
const int N=3996000;
int n;
struct node{int u,v,nex;
}x[N<<1];
struct Node{int st,end,t;
}k[1001];
int cnt,head[2001];
void add(int u,int v){
//    printf("u:%d v:%d\n",u,v);x[cnt].u=u,x[cnt].v=v,x[cnt].nex=head[u],head[u]=cnt++;
}
/*上 下+n*/
bool judge(int s1,int e1,int s2,int e2){if(s1>s2) swap(s1,s2),swap(e1,e2);if(e1>s2) return 0;return 1;
}
int dfn[2001],low[2001],num,co[2001],col,sta[2001],tot;
void tarjan(int f){dfn[f]=low[f]=++num;sta[++tot]=f;for(int i=head[f];i!=-1;i=x[i].nex){if(!dfn[x[i].v]){tarjan(x[i].v);low[f]=min(low[f],low[x[i].v]);}else if(!co[x[i].v]) low[f]=min(low[f],dfn[x[i].v]);}if(low[f]==dfn[f]){co[f]=++col;while(sta[tot]!=f){co[sta[tot]]=col;tot--;}tot--;}return;
}
void print(int S){printf("%02d:%02d",S/60,S%60);
}
void solve(){memset(head,-1,sizeof(head)),cnt=0;memset(co,0,sizeof(co)),col=0,memset(dfn,0,sizeof(dfn)),memset(low,0,sizeof(low)),num=0;for(int i=1;i<=n;i++){int h1=read(),min1=read(),h2=read(),min2=read(),t=read();k[i].st=h1*60+min1,k[i].end=h2*60+min2;k[i].t=t;}for(int i=1;i<=n;i++){for(int j=i+1;j<=n;j++){/*i场上 j场上*/int s1=k[i].st,e1=k[i].st+k[i].t;int s2=k[j].st,e2=k[j].st+k[j].t;if(!judge(s1,e1,s2,e2)) add(i,j+n),add(j,i+n);/*i场上 j场下*/s1=k[i].st,e1=k[i].st+k[i].t;s2=k[j].end-k[j].t,e2=k[j].end;if(!judge(s1,e1,s2,e2)) add(i,j),add(j+n,i+n);/*i场下 j场上*/s1=k[i].end-k[i].t,e1=k[i].end;s2=k[j].st,e2=k[j].st+k[j].t;if(!judge(s1,e1,s2,e2)) add(i+n,j+n),add(j,i);/*i场下 j场下*/s1=k[i].end-k[i].t,e1=k[i].end;s2=k[j].end-k[j].t,e2=k[j].end;if(!judge(s1,e1,s2,e2)) add(i+n,j),add(j+n,i);}}for(int i=1;i<=2*n;i++)if(!dfn[i]) tarjan(i);for(int i=1;i<=n;i++)if(co[i]==co[i+n]){printf("NO\n");return;}printf("YES\n");for(int i=1;i<=n;i++){if(co[i]<co[i+n]){print(k[i].st);cout<<" ";print(k[i].st+k[i].t);}else {print(k[i].end-k[i].t);cout<<" ";print(k[i].end);}printf("\n");}return;
}
int main(){while(scanf("%d",&n)!=EOF)solve();
}

View Code

转载于:https://www.cnblogs.com/si-rui-yang/p/10186730.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. poj3683 Priest John's Busiest Day

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

  3. [题解]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 ...

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

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

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

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

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

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

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

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

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

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

  9. POJ 3683 Priest John's Busiest Day

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

  10. 图论 —— 2-SAT 问题

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

最新文章

  1. BitmapFactory.Options.inSampleSize 的使用方法
  2. android spinner 简书,【Android】Spinner:下拉列表笔记
  3. 【计算机网络】计算机网络 OSI 参考模型 ( 计算机网络分层结构 | OSI 七层参考模型 | 应用层 | 表示层 | 会话层 | 传输层 | 网络层 | 数据链路层 | 物理层 )
  4. python tkinter 布局_python tkinter组件摆放方式详解
  5. DM6446 OSD
  6. python新手输出错误,Python 新手常犯错误(第一部分)
  7. Android中MVC框架的运用
  8. 【2019.09.07】2019徐州网络赛
  9. [置顶] 基于tlplayer的ios应用《虎跃在线课堂-英语篇》上线了
  10. map函数的用法python,详解Python map函数及Python map()函数的用法
  11. Linux 安装Nginx详细图解教程
  12. IOS7开发~Xcode5制作framework
  13. mysql手册中文版
  14. Android开发之音乐播放器
  15. 云服务器功能检验方法
  16. 香山处理器仿真环境搭建
  17. Staring into the Abyss: An Evaluation of Concurrency Control with One Thousand Cores 论文阅读
  18. 利用向量积(叉积)计算三角形(多边形)的面积
  19. oracle中text是什么意思,ORACLE TEXT是什么
  20. MacBook 查询电池健康情况、电池损耗、当前电量的方法

热门文章

  1. python读feather格式文件
  2. Git Conventional Commits (Git代码提交说明规范)
  3. 【OR】约束优化:对偶理论(1)
  4. jdk官网下载与安装
  5. 微分中值定理定义及几何意义
  6. 世界上有10种人,一种是懂二进制的人,一种是不懂二进制的人。
  7. 未来可期的TypeScript
  8. 实验吧——安全杂项之“A记录”详解
  9. androidstudio上传自己的lib到Jcenter
  10. 电路基础-交流电-正弦量和相量