题目大概意思为有一个神父,N场婚礼,给每场婚礼的开始时间 S ,结束时间 T ,和持续时间 D ,神父可以在开始 S 到 S + D 时,或者结束 T - D 到 T 时,两选一时间段在场,神父从不同婚礼上穿梭的时间忽略不计,现在问神父是否能在所有婚礼上出现,若是可以输出所有婚礼的神父在场时间段

每次婚礼都有两种可选择,相当于布尔真假,且有一定限制条件,妥妥的2-SAT

连边只要搞清楚 2-SAT 的原理即可,我们连边(A,B),就相当于选 A 就必须选 B,因此判断假如两场婚礼 a , b ,初始为 A ,末尾为 B ,如果 a_A 和 b_B 有交集,则相当于选了 a_A 就必须选 b_A,选 b_B 就必须选 a_B,把这个弄清楚就可以开始判断各个范围之间是否有交集,构造图

最后套个2-SAT模板即可
(基础 2-SAT 题无坑无难点)

#include <iostream>
#include <stdio.h>
#include <vector>
#include <string.h>
using namespace std;
struct ddd
{int start, over, spend;
}data[1005];
vector<int> edge[2005];
vector<int> redge[2005];
vector<int> flag;
int used[10005];
int kind[10005];
int N;
void dfs(int v)
{used[v] = true;for(int i = 0; i < edge[v].size(); i++){if(!used[edge[v][i]]){dfs(edge[v][i]);}}flag.push_back(v);
}
void rdfs(int v, int k)
{used[v] = true;kind[v] = k;for(int i = 0; i < redge[v].size(); i++){if(!used[redge[v][i]]){rdfs(redge[v][i], k);}}
}
int main()
{scanf("%d", &N);for(int i = 0; i < N; i++){int hour, minutes;scanf("%d:%d", &hour, &minutes);data[i].start = hour * 60 + minutes;scanf("%d:%d", &hour, &minutes);data[i].over = hour * 60 + minutes;scanf("%d", &data[i].spend);}for(int i = 0; i < N; i++){for(int j = i + 1; j < N; j++){if(min(data[i].start + data[i].spend, data[j].start + data[j].spend) > max(data[i].start, data[j].start)){edge[i].push_back(j + N);edge[j].push_back(i + N);redge[j + N].push_back(i);redge[i + N].push_back(j);}if(min(data[i].start + data[i].spend, data[j].over) > max(data[i].start, data[j].over - data[j].spend)){edge[i].push_back(j);edge[j+N].push_back(i+N);redge[j].push_back(i);redge[i+N].push_back((j+N));}if(min(data[i].over, data[j].start + data[j].spend) > max(data[i].over - data[i].spend, data[j].start)){edge[i+N].push_back(j+N);edge[j].push_back(i);redge[j+N].push_back(i+N);redge[i].push_back(j);}if(min(data[i].over, data[j].over) > max(data[i].over - data[i].spend, data[j].over - data[j].spend)){edge[i+N].push_back(j);edge[j+N].push_back(i);redge[j].push_back(i+N);redge[i].push_back(j+N);}}}memset(used, false, sizeof(used));for(int i = 0; i < N; i++){if(!used[i]) dfs(i);}memset(used, false, sizeof(used));int num = 0;for(int i = flag.size() - 1; i >= 0; i--){if(!used[flag[i]]) rdfs(flag[i], num++);}for(int i = 0; i < N; i++){if(kind[i] == kind[i + N]){printf("NO\n");return 0;}}printf("YES\n");for(int i = 0; i < N; i++){if(kind[i] > kind[i + N]){printf("%02d:%02d %02d:%02d\n", data[i].start / 60, data[i].start % 60, (data[i].start + data[i].spend) / 60, (data[i].start + data[i].spend) % 60);}else{printf("%02d:%02d %02d:%02d\n", (data[i].over - data[i].spend) / 60, (data[i].over - data[i].spend) % 60, data[i].over / 60, data[i].over % 60);}}
}

poj3683(2-SAT)相关推荐

  1. (2 sat) hdu 1824

    Let's go home Time Limit: 10000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  2. 嵌入式系统开发:基于Linux学习笔记整理(学期汇总)

    Linux命令操作部分 Ubuntu虚拟机使用 快照 拍摄快照是为了方便还原虚拟机,因为虚拟机(Virtual Machine)是虚拟出来的出来的一台物理计算机,如果你在实验中操作不当或者其他原因导致 ...

  3. 第6-8课:分离轴算法(SAT)与碰撞检测(图文篇)

    物体的碰撞检测是游戏软件中的关键算法之一,两个角色是否能够对话.子弹是否击中了物体,以及是否出现人物穿墙的 bug,都依赖于一套可靠的碰撞检测算法.有很多算法可以实现碰撞检测,基于算法几何的方法有轴对 ...

  4. R语言用WinBUGS 软件对学术能力测验(SAT)建立层次(分层)贝叶斯模型

    R2WinBUGS软件包提供了从R调用WinBUGS的便捷功能.它自动以WinBUGS可读的格式写入数据和脚本,以进行批处理(自1.4版开始).WinBUGS流程完成后,可以通过程序包本身将结果数据读 ...

  5. R语言用WinBUGS 软件对学术能力测验(SAT)建立分层模型

    原文链接:http://tecdat.cn/?p=11974 R2WinBUGS软件包提供了从R调用WinBUGS的便捷功能.它自动以WinBUGS可读的格式写入数据和脚本,以进行批处理(自1.4版开 ...

  6. 布尔表达式可满足性问题(SAT)与库克-列文定理(上)

    下篇:布尔表达式可满足性问题(SAT)与库克-列文定理(下). 文章目录 一.布尔表达式可满足性问题(Boolean Satisfiability Problem, SAT) 二.形式语言与自动机 1 ...

  7. 年度盘点!必看AI顶会论文、Github高星项目大合集(附链接)

    目前,国外计算机界评价学术水平主要是看在顶级学术会议上发表的论文,特别是在机器学习.计算机视觉和人工智能领域,顶级会议才是王道.本期我们盘点了2019年人工智能领域的顶会,如最核心的顶会AAAI.IJ ...

  8. pandas使用bdate_range函数获取起始时间(start)和结束时间(end)范围内的所有周末日期(weekends day)

    pandas使用bdate_range函数获取起始时间(start)和结束时间(end)范围内的所有周末日期(weekends day) #pandas使用bdate_range函数获取起始时间(st ...

  9. 图灵访谈系列之八:对话归隐的大师——Donald E. Knuth(高德纳)

    计算机科学泰斗Donald E. Knuth(高德纳)归隐已近20载,不问世事,潜心修订并继续创作煌煌巨著<计算机程序设计艺术>(The Art of Computer Programmi ...

  10. 独家 | 年度盘点!必看AI顶会论文、Github高星项目大合集(附链接)

    目前,国外计算机界评价学术水平主要是看在顶级学术会议上发表的论文,特别是在机器学习.计算机视觉和人工智能领域,顶级会议才是王道.本期我们盘点了2019年人工智能领域的顶会,如最核心的顶会AAAI.IJ ...

最新文章

  1. 多线程-多图下载综合案例-SDWebImage框架实现代码
  2. 代码下移快捷键_Intellij IDEA 快捷键大全
  3. struts2.3.12+hibernate4.3.11+spring4.2.2整合问题2java.lang.ClassNotFoundException: org.springframework.w
  4. vs2015 去除 git 源代码 绑定,改成向tfs添加源码管理
  5. 最好的方法,是为你们量身定制!
  6. SSM+solr 通过商品搜索学习solr的简单使用
  7. 字节跳动学前端还是java_【全国】—Java/前端工程师—字节跳动
  8. 检测用户浏览器是否支持cookie
  9. canvas绘制圆环
  10. python实现排序算法 整理
  11. 大学排行榜 : qs全球世界 大学排行榜
  12. Autodesk 3DSMax 2016 安装注册说明
  13. 求助,nodejs 在安装threads_a_gogo时报错
  14. Android性能优化第(七)篇---StrickMode严苛模式检测耗时与内存问题
  15. 【联想电脑升级网卡】BIOS 无线网卡白名单限制解决办法——不用刷BIOS,不用修改白名单,只需简单升级即可
  16. 学python可以从事什么工作,python是做什么的软件
  17. classpath、path、JAVA_HOME的作用及JAVA环境变量配置
  18. 数据库String字符串
  19. CentOS7.6安装weblogic14.1.1.0.0
  20. 100000以内的质数表

热门文章

  1. JavaFX项目jar使用javafxpackager生成exe
  2. oracle 查看表是否被锁
  3. SHELL-命令解释程序
  4. 测试php语句执行时间
  5. ubuntu+php+mysql+apache安装配置
  6. linux常用的命令行
  7. 新手也能立即上手,用Python90多行代码画出“樱花园”仙境(源码+注释)
  8. 非计算机专业想学习Python,有哪些问题需要注意?
  9. static string java_java:String类、static关键字、Arrays类、 Math类
  10. 一键移植工具_【产品推广】让UI设计畅通无阻 — 信息系统人机界面增强工具(HFE Designer)...