/*
2sat问题
输出任意一组可行解
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
#define N 2100
struct node {
int u,v,next;
}ff[N],bian[N*N*8];
int head[N],yong,low[N],dfn[N],belong[N],ans,top,index,stac[N],vis[N];
void init()
{
memset(head,-1,sizeof(head));
yong=index=ans=top=0;
memset(vis,0,sizeof(vis));
memset(dfn,0,sizeof(dfn));
}
void addedge(int u,int v)
{
bian[yong].u=u;//有的时候不能少,因为下面要用到
bian[yong].v=v;
bian[yong].next=head[u];
head[u]=yong++;
}
void tarjan(int u)
{
low[u]=dfn[u]=++index;
stac[++top]=u;
vis[u]=1;
int i;
for(i=head[u]; i!=-1; i=bian[i].next)
{
int v=bian[i].v;
if(!dfn[v])
{
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(vis[v])
low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u])
{
ans++;
int t;
do
{
t=stac[top--];
belong[t]=ans;
vis[t]=0;
}
while(t!=u);
}
}
int slove(int n)
{
int i;
for(i=0; i<n*2; i++)
if(!dfn[i])
tarjan(i);
// printf("%d\n",ans);
for(i=0; i<n; i++)
if(belong[i]==belong[i+n])
return 0;
return 1;
}
int judge(struct node a,struct node b) {
if(a.v<=b.u||b.v<=a.u)
return 0;
return 1;
}
int fp[N],indegree[N],color[N];
vector<int>q[N];
void print(struct node a) {
printf("%02d:%02d %02d:%02d\n",a.u/60,a.u%60,a.v/60,a.v%60);
}
void oper(int n) {
int i;
for(i=0;i<n;i++) {
fp[belong[i]]=belong[i+n];
fp[belong[i+n]]=belong[i];
}
for(i=1;i<=ans;i++) {
q[i].clear();
color[i]=0;
indegree[i]=0;
}
for(i=0;i<yong;i++) {
int aa=bian[i].u;
int bb=bian[i].v;
if(belong[aa]!=belong[bb]) {
q[belong[bb]].push_back(belong[aa]);
indegree[belong[aa]]++;
}
}
queue<int>qq;
for(i=1;i<=ans;i++) {
if(indegree[i]==0)
qq.push(i);
}
while(!qq.empty()) {
int cur=qq.front();
qq.pop();
if(color[cur]==0) {
color[cur]=1;
color[fp[cur]]=2;
}
for(i=0;i<(int)q[cur].size();i++) {
int v=q[cur][i];
if(--indegree[v]==0)
qq.push(v);
}
}
for(i=0;i<n;i++) {
if(color[belong[i]]==1)
print(ff[i]);
else
print(ff[i+n]);
}
}
int main() {
int n,i,j,k,u,v,uu,vv,d;
while(scanf("%d",&n)!=EOF) {
for(i=0;i<n;i++) {
scanf("%d:%d %d:%d%d",&u,&v,&uu,&vv,&d);
j=u*60+v;
k=uu*60+vv;
ff[i].u=j;ff[i].v=j+d;
ff[i+n].u=k-d;ff[i+n].v=k;
}
init();
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++) {
if(judge(ff[i],ff[j])) {
addedge(i,j+n);
addedge(j,i+n);
}
if(judge(ff[i],ff[j+n])) {
addedge(i,j);
addedge(j+n,i+n);
}
if(judge(ff[i+n],ff[j])) {
addedge(i+n,j+n);
addedge(j,i);
}
if(judge(ff[i+n],ff[j+n])) {
addedge(i+n,j);
addedge(j+n,i);
}
}
if(!slove(n)) {
printf("NO\n");
continue;
}
printf("YES\n");
oper(n);
}
return 0;}

poj 3683 2-sat问题,输出任意一组可行解的更多相关文章

  1. 2-sat 输出任意一组可行解&拓扑排序+缩点 poj3683

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

  2. HDU 1507 Uncle Tom's Inherited Land*(二分匹配,输出任意一组解)

    Uncle Tom's Inherited Land* Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (J ...

  3. 洛谷 P4174 [NOI2006]最大获利 && 洛谷 P2762 太空飞行计划问题 (最大权闭合子图 && 最小割输出任意一组方案)

    https://www.luogu.org/problemnew/show/P4174 最大权闭合子图的模板 每个通讯站建一个点,点权为-Pi:每个用户建一个点,点权为Ci,分别向Ai和Bi对应的点连 ...

  4. poj 3648 2-sat 输出任意一组解模板

    转载地址:http://blog.csdn.net/qq172108805/article/details/7603351 /* 2-sat问题,题意:有对情侣结婚,请来n-1对夫妇,算上他们自己共n ...

  5. POJ 3683 Priest John&#39;s Busiest Day (2-SAT+输出可行解)

    题目地址:POJ 3683 第一次做须要输出可行解的题目. . .大体思路是先用强连通来推断是否有可行解,然后用逆序建图.用拓扑排序来进行染色.然后输出可行解. 详细思路见传送门 由于推断的时候少写了 ...

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

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

  7. poj 3683(2-sat+输出一组可行解)

    题目链接:http://poj.org/problem?id=3683 思路:对于每个结婚仪式,只有在开始或结束时进行这两种选择,我们可以定义xi为真当且仅当在开始时进行.于是我们可以通过时间先后确定 ...

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

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

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

随机推荐

  1. HtmlUnit爬取Ajax动态生成的页面内容

    HtmlUnit说白了就是一个浏览器,这个浏览器是用Java写的无界面的浏览器,正因为其没有界面,因此执行的速度还是可以滴. HtmlUnit提供了一系列的API,这些API可以干的功能比较多,如表单 ...

  2. php一致性hash性能测试(flexihash/memcache/memcached)

    一致性hash的使用在PHP中有三种选择分别是原生的memcache扩展,memcached扩展,还有一个是网上比较流行的flexihash类. 最近有项目需要使用flexihash类操作memcac ...

  3. 【转】Java集合:HashMap源码剖析

    Java集合:HashMap源码剖析   一.HashMap概述二.HashMap的数据结构三.HashMap源码分析     1.关键属性     2.构造方法     3.存储数据     4.调 ...

  4. html语法第 -2

    1 <html> 2 <head> 3 <title>这是第一节课网页标题</title> 4 <meta charset="UTF-8 ...

  5. configure: error: MySQL library not found

    在CentOS系统中,安装zabbix进行configure时会遇到以下问题 ./configure --enable-server --enable-agent --with-mysql --wit ...

  6. Hibernate Lazy属性与懒加载 整理

    lazy概念:要用到的时候,再去加载,对于关联的集合来说,只有当访问到的时候,才去加载它所关联的集合,比如一个user对应很多权限,只有当user.getRights()的时候,才发出select r ...

  7. git 本地与远程仓库出现代码冲突解决方法

    提交过程中报错: [python@heaven-00 Selesystem]$ git push -u origin masterUsername for 'https://github.com': ...

  8. Js 之获取QueryString的几种方法

    一.正则匹配 function getQueryString(name) { var reg = new RegExp('(^|&)' + name + '=([^&]*)(& ...

  9. linux 复制文件夹内所有文件到另一个文件夹

    cp -Rf /home/user1/* /root/temp/将 /home/user1目录下的所有东西拷到/root/temp/下而不拷贝user1目录本身.即格式为:cp -Rf 原路径/ 目的 ...

  10. 通过 getResources 找不到jar包中的资源和目录的解决方法

    http://my.oschina.net/sub/blog/184074 今天碰到一个怪问题: 原本跑的好好的代码,打成 jar 包就不能运行了. 问题出在,代码中有一段自动扫描 classpath ...