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

题目链接:http://poj.org/problem?id=3683

题意:有n个婚礼要举行,但是只有一个牧师。第i个婚礼使用牧师的时间长为leni,可以在开始时或结束时使用。问能否使得n个婚礼均举行?

思路:对于婚礼i,i*2-1表示在开始使用牧师,i*2表示在结束使用牧师。枚举每一对不同的i和j:

(1)如果i*2-1和j*2-1冲突。连接i*2-1  j*2

(2)如果i*2-1和j*2冲突,连接i*2-1 j*2-1

(3)如果i*2和j*2-1冲突,连接i*2 j*2

(4)如果i*2和j*2冲突,连接i*2 j*2-1

 

 #include <stdio.h>#include <string.h>#include <stack>#define min(x,y) ((x)<(y)?(x):(y))using namespace std;struct node{int v,next;};const int MAX=4005;const int MAXE=5000005;node edges[MAXE];int head[MAX],e;int dfn[MAX],low[MAX],visit[MAX],color[MAX],col[MAX];int n,index,cnt;stack<int> S;int deg[MAX],ans[MAX],p[MAX];int head1[MAX],e1;node edges1[MAXE];void Add(int u,int v){edges[e].v=v;edges[e].next=head[u];head[u]=e++;}void Add1(int u,int v){edges1[e1].v=v;edges1[e1].next=head1[u];head1[u]=e1++;}void Tarjan(int u){int i,v;low[u]=dfn[u]=++index;S.push(u);visit[u]=1;for(i=head[u];i!=-1;i=edges[i].next){v=edges[i].v;if(!dfn[v]){Tarjan(v);low[u]=min(low[u],low[v]);}else if(visit[v]) low[u]=min(low[u],dfn[v]);}if(dfn[u]==low[u]){cnt++;do{v=S.top();S.pop();visit[v]=0;color[v]=cnt;}while(u!=v);}}void init(){memset(deg,0,sizeof(deg));memset(head1,-1,sizeof(head1));e1=0;int i,u,v,x,y;for(u=1;u<=2*n;u++){for(i=head[u];i!=-1;i=edges[i].next){v=edges[i].v;if(color[v]!=color[u]){x=color[v];y=color[u];Add1(x,y);deg[y]++;}}}while(!S.empty()) S.pop();for(i=1;i<=cnt;i++) if(!deg[i]) S.push(i);memset(p,0,sizeof(p));while(!S.empty()){u=S.top();S.pop();if(!p[u]) p[u]=1,p[col[u]]=-1;for(i=head1[u];i!=-1;i=edges1[i].next){v=edges1[i].v;if(--deg[v]==0) S.push(v);}}memset(ans,0,sizeof(ans));for(i=1;i<=n;i++){if(p[color[i*2-1]]==1) ans[i]=1;}}int TWO_ST(){int i;memset(dfn,0,sizeof(dfn));memset(visit,0,sizeof(visit));index=cnt=0;while(!S.empty()) S.pop();for(i=1;i<=2*n;i++) if(!dfn[i]) Tarjan(i);for(i=1;i<=n;i++){if(color[i*2-1]==color[i*2]) return 0;col[color[i*2-1]]=color[i*2];col[color[i*2]]=color[i*2-1];}init();return 1;}struct Node{int s,e,len;};Node a[MAX];void deal(){if(!TWO_ST()){puts("NO");return;}puts("YES");int i,x,y;for(i=1;i<=n;i++){ans[i]?(x=a[i].s,y=a[i].s+a[i].len):(x=a[i].e-a[i].len,y=a[i].e);printf("%02d:%02d %02d:%02d\n",x/60,x%60,y/60,y%60);}}int OK(int s1,int len1,int s2,int len2){return s1<s2+len2&&s2<s1+len1;}int main(){while(scanf("%d",&n)!=-1){int i,j,h1,m1,h2,m2;for(i=1;i<=n;i++){scanf("%d:%d %d:%d %d",&h1,&m1,&h2,&m2,&a[i].len);a[i].s=h1*60+m1;a[i].e=h2*60+m2;}memset(head,-1,sizeof(head));e=0;int u,v;for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(i!=j){if(OK(a[i].s,a[i].len,a[j].s,a[j].len)) Add(i*2-1,j*2);if(OK(a[i].s,a[i].len,a[j].e-a[j].len,a[j].len)) Add(i*2-1,j*2-1);if(OK(a[i].e-a[i].len,a[i].len,a[j].s,a[j].len)) Add(i*2,j*2);if(OK(a[i].e-a[i].len,a[i].len,a[j].e-a[j].len,a[j].len)) Add(i*2,j*2-1);}deal();}return 0;}

 

  

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/449745.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

12个git实战建议和技巧

摘要&#xff1a;git无疑是现在最热门的版本控制工具&#xff0c;而且正在进一步侵占SVN以及CVS的市场。本文作者从国外技术问答社区Stack Overflow整理的12个很实用的git使用技巧和建议&#xff0c;希望对你有帮助。 1.使用“git diff”来折叠多行 用git diff经常会出现很多内…

python读写json和txt

读写json #数据保存如json文件 import json jsObj json.dumps(code_sec) fileObject open(jsonFile.json, w) fileObject.write(jsObj) fileObject.close() #读取json文件 # 将类文件对象中的JSON字符串直接转换成 Python 字典 with open(jsonFile.json, r, encoding…

Java 12 将于3月19日发布,8 个最终 JEP 一览

开发四年只会写业务代码&#xff0c;分布式高并发都不会还做程序员&#xff1f; JDK 12 已于2018年12月进入 Rampdown Phase One 阶段&#xff0c;这意味着该版本所有新的功能特性被冻结&#xff0c;不会再加入更多的 JEP 。该阶段将持续一个月&#xff0c;主要修复 P1-P3 级…

股票期货数据的resample处理

​ import pandas as pd stock_day pd.read_csv("stock_day.csv") stock_day stock_day.sort_index() # 对每日交易数据进行重采样 &#xff08;频率转换&#xff09; stock_day.index# 1、必须将时间索引类型转换成Pandas默认的类型 stock_day.index pd.to_datet…

ArcEngine调用FeatureToLine工具传参问题

FeatureToLine工具的in_features参数不能为内存图层&#xff0c;否则会报内存错误&#xff0c;正确的写法如下&#xff1a; FeatureToLine ftrToLine new FeatureToLine(); ftrToLine.in_features cpj.TempWs.PathName "\OriginDataset\" currentFc.Key; ftrToLi…

程序员如何做出“不难看”的设计

摘要&#xff1a;程序员在写代码的时候往往只注重功能的实现和性能的提升&#xff0c;忽视了外观和易用性&#xff0c;其实很多时候只要注意一些基本的规则&#xff0c;就可以大幅度提高产品的观感。 经常看到程序员展示自己做的东西&#xff0c;有一些是创业项目&#xff0c;有…

微服务实战(二):使用API Gateway

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 当你决定将应用作为一组微服务时&#xff0c;需要决定应用客户端如何与微服务交互。在单体式程序中&#xff0c;通常只有一组冗余的或者…

sql数据库挖坑

sql数据库存入数据时&#xff0c;因为列 名不允许有括号&#xff0c;无法识别&#xff0c;需要对括号进行剔除 df df.rename(columnslambda x: x.replace("(","").replace(),))

力扣——顶端迭代器

给定一个迭代器类的接口&#xff0c;接口包含两个方法&#xff1a; next() 和 hasNext()。设计并实现一个支持 peek() 操作的顶端迭代器 -- 其本质就是把原本应由 next() 方法返回的元素 peek() 出来。 示例: 假设迭代器被初始化为列表 [1,2,3]。调用 next() 返回 1&#xff0c…

五步让你成为专家级程序员

摘要&#xff1a;Mark Lassoff是一位高级技术培训师&#xff0c;从事培训工作已有10余年。他培训的客户包括美国国防部、Lockheed Martin等。在多年的培训生涯中&#xff0c;他总结了一些如何快速学习一门语言的技巧&#xff0c;这些技巧非常简单&#xff0c;但是却让人受益匪浅…

Ionic混合移动app框架学习

第一章 绪论创建移动app有三种安卓原生App&#xff0c;使用java语言&#xff0c;目前推荐kotlin语言&#xff0c;开发工具Android studioIOS原生App&#xff0c;使用Objective-C或者Swift语言&#xff0c;开发工具Xcode混合移动App&#xff0c;使用web通用语言&#xff08;HTML…

IPC 中 LPC、RPC 的区别和联系

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 进程间通信&#xff08;IPC&#xff0c;Inter-Process Communication&#xff09;&#xff0c;指至少两个进程或线程间传送数据或信号的…

Laravel 使用 Aliyun OSS 云存储

对象存储 ( Object Storage Service, 简称 OSS ) OSS 相信大家都听过, 它是阿里云对外提供的海量, 安全和高可靠的云存储服务. 大家可以把自己网站的资源存上面加快自己网站速度, aliyun 官网也有文档不过对于新手来说有点难, 那么这里我给大家推荐一个组件和组件的使用. johnl…

python多级索引修改

创建多级索引 cols pd.MultiIndex.from_tuples([("a","b"), ("a","c")]) pd.DataFrame([[1,2], [3,4]], columnscols) abc012134 df.columns df.columns.droplevel() df bc012134

在线学习新编程 技巧全攻略

摘要&#xff1a;有句俗语叫&#xff1a;“技多不压身”&#xff0c;如果你有时间和兴趣&#xff0c;不妨多了解和掌握编程技能&#xff0c;或许随时可能有用。本文为你收集了一些编程技巧&#xff0c;让你轻松学编程。 有句俗语叫&#xff1a;“技多不压身”&#xff0c;如果你…

第 3 章 镜像 - 018 - 镜像命名的最佳实践

为镜像命名 创建镜像时 docker build 命令时已经为镜像取了个名字&#xff0c;例如&#xff1a; docker build -t ubuntu-with-vi 这里的 ubuntu-with-vi 就是镜像的名字。通过 dock images 可以查看镜像的信息。 1 rootubuntu:~# docker images ubuntu-with-vi 2 REPOSITORY …

Jmeter逻辑控制器-ForEach Controller

ForEach Controller 介绍 ForEach Contoller 即循环控制器&#xff0c;顾名思义是定义一个规则。主要有以下一个参数&#xff1a;名称&#xff1a;随便填写注释&#xff1a;随便填写输入变量前缀&#xff1a;可以在“用户自定义变量”中定义一组变量。循环控制器可以从中获取到…

微服务实战(三):深入微服务架构的进程间通信

见&#xff1a;http://www.dockone.io/article/549简介 在单体式应用中&#xff0c;各个模块之间的调用是通过编程语言级别的方法或者函数来实现的。但是一个基于微服务的分布式应用是运行在多台机器上的。一般来说&#xff0c;每个服务实例都是一个进程。因此&#xff0c;如下…

python输出与删除某行或某列

python输出字符&#xff0c;主要为结合变量形成新的变量名 year 2016 event Referendum fResults of the {year} {event}Results of the 2016 Referendum yes_votes 42_572_654 no_votes 43_132_495 percentage yes_votes / (yes_votes no_votes) {:-9} YES votes {:2…

为什么应该用模块取代C/C++中的头文件?

摘要&#xff1a;本文整理自Apple C工程师Doug Gregor的演讲Slide&#xff0c;他表示希望使用模块&#xff08;Module&#xff09;这一概念替代C/C中的头文件&#xff0c;现已被C标准化委员会任命为Module研究组的主席&#xff0c;研究该提议的可能性。考虑到Apple的开源项目LL…