发现建图的方法各有不同,前面一题连边和这一题连边建图的点就不同,感觉这题的建图方案更好。

题意:给出每个婚礼的2个主持时间,每个婚礼的可能能会冲突,输出方案。

思路:n个婚礼,2*n个点,每组点是对称的,用O(n2)的方法判断每个点之间的关系来建图,然后通过拓扑排序输出即可。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define MAXN 2002
int instack[MAXN],stack[MAXN],fa[MAXN],vis[MAXN],head[MAXN],first[MAXN];
int dfn[MAXN],low[MAXN],in[MAXN],ans[MAXN];
int a[MAXN][2],b[MAXN][2],flag[MAXN];
int n,m,tot,scnt,time,tt,top,index; struct Edge
{
int v,next;
}edge[MAXN*MAXN],e[MAXN*MAXN]; void addedge(int u,int v)
{
edge[tot].v=v;
edge[tot].next=head[u];
head[u]=tot++;
}
void adde(int u,int v)
{
e[tt].v=v;
e[tt].next=first[u];
first[u]=tt++;
}
void print(int t)
{
int h=t/60,m=t%60;
printf("%02d:%02d",h,m);
} void tarjan(int u)
{
instack[u]=1;
stack[top++]=u;
dfn[u]=low[u]=++index;
int v;
for(int i=head[u];i!=-1;i=edge[i].next)
{
v=edge[i].v;
if(!dfn[v])
{
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(instack[v])
{
low[u]=min(low[u],dfn[v]);
}
}
if(low[u]==dfn[u])
{
scnt++;
do
{
v=stack[--top];
instack[v]=0;
fa[v]=scnt;
}while(v!=u);
}
}
void build()
{
for(int i=0;i<n;i++) //有2n个点 2*i 代表起始时间 2*i+1代表结束时间
{
for(int j=i+1;j<n;j++)
{
if((a[i][1]-a[j][0])*(a[i][0]-a[j][1])<0) //前 前冲突
{
addedge(i*2,2*j+1);
addedge(j*2,2*i+1);
}
if((a[i][1]-b[j][0])*(a[i][0]-b[j][1])<0) //前 后
{
addedge(i*2,2*j);
addedge(j*2+1,2*i+1);
}
if((b[i][1]-b[j][0])*(b[i][0]-b[j][1])<0) //后后
{
addedge(2*i+1,2*j);
addedge(2*j+1,2*i);
}
if((b[i][1]-a[j][0])*(b[i][0]-a[j][1])<0) //后前
{
addedge(2*i+1,2*j+1);
addedge(2*j,2*i);
}
}
}
}
void solve()
{
memset(dfn,0,sizeof(dfn));
memset(instack,0,sizeof(instack));
index=0;scnt=0;
for(int i=0;i<2*n;i++)
{
if(!dfn[i])
tarjan(i);
}
}
int check()
{
for(int i=0;i<n;i++)
{
if(fa[2*i]==fa[2*n+1]) //冲突
{
return 0;
}
}
return 1;
}
void topsort()
{ for(int i=0;i<scnt;)
{
for(int j=1;j<=scnt;j++)
{
if(!in[j])
{
in[j]--;ans[i++]=j;
for(int k=first[j];k!=-1;k=e[k].next)
{
int v=e[k].v;
in[v]--;
}
}
}
}
memset(flag,0,sizeof(flag));
for(int i=0;i<scnt;i++)
{
for(int j=0;j<2*n;j++)
{
if(fa[j]==ans[i]&&!flag[j^1])
{ flag[j]=1;
}
}
}
for(int i=0;i<2*n;i++)
{
if(flag[i])
{
if(i%2==0)
{
print(a[i/2][0]);printf(" ");print(a[i/2][1]);printf("\n");
}
else
{
print(b[i/2][0]);printf(" ");print(b[i/2][1]);printf("\n");
}
}
}
}
int main()
{
scanf("%d",&n);
memset(head,-1,sizeof(head));tot=0;
memset(first,-1,sizeof(first));tt=0;
for(int i=0;i<n;i++)
{
int t1,t2;
scanf("%d:%d",&t1,&t2);
a[i][0]=t1*60+t2;
scanf("%d:%d",&t1,&t2);
b[i][1]=t1*60+t2;
scanf("%d",&time);
a[i][1]=a[i][0]+time;
b[i][0]=b[i][1]-time;
}
build();
solve();
if(!check())printf("NO\n");
else
{
memset(in,0,sizeof(in));
for(int i=0;i<2*n;i++)
{
int v;
for(int j=head[i];j!=-1;j=edge[j].next)
{
v=edge[j].v;
if(fa[i]!=fa[v])
{
adde(fa[v],fa[i]);
in[fa[i]]++;
}
}
}
printf("YES\n");
topsort();
} return 0;
}

poj 3683 2-sat建图+拓扑排序输出结果的更多相关文章

  1. HDU4857——逃生(反向建图+拓扑排序)(BestCoder Round #1)

    逃生 Description 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能排成一行. 现在有n个人,从1标号到n.同时有一些奇怪的约束条件,每个都形如:a必须在b之前.同时,社会 ...

  2. POJ3687——Labeling Balls(反向建图+拓扑排序)

    Labeling Balls DescriptionWindy has N balls of distinct weights from 1 unit to N units. Now he tries ...

  3. BZOJ_4383_[POI2015]Pustynia_线段树优化建图+拓扑排序

    BZOJ_4383_[POI2015]Pustynia_线段树优化建图+拓扑排序 Description 给定一个长度为n的正整数序列a,每个数都在1到10^9范围内,告诉你其中s个数,并给出m条信息 ...

  4. 牛客多校第四场 J.Hash Function(线段树优化建图+拓扑排序)

    题目传送门:https://www.nowcoder.com/acm/contest/142/J 题意:给一个hash table,求出字典序最小的插入序列,或者判断不合法. 分析: eg.对于序列{ ...

  5. hdu 4857 逆向建图+拓扑排序 ***

    题意:糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能排成一行.现在有n个人,从1标号到n.同时有一些奇怪的约束条件,每个都形如:a必须在b之前.同时,社会是不平等的,这些人有的穷有 ...

  6. HUD2647 Reward_反向建图拓扑排序

    HDU2647 Reward 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2647 题意:老板要发奖金了,有n个人,给你m对数,类似a b,这样的一对 ...

  7. 逃生 HDU 4857(反向建图 + 拓扑排序)

    逃生 链接 Problem Description 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能排成一行. 现在有n个人,从1标号到n.同时有一些奇怪的约束条件,每个都形如:a必 ...

  8. [POI2015][bzoj4383] Pustynia [线段树优化建图+拓扑排序]

    题面 bzoj权限题传送门 luogu传送门 思路 首先,这个题目显然可以从所有小的点往大的连边,然后如果没环就一定可行,从起点(入读为0)开始构造就好了 但是问题来了,如果每个都连的话,本题中边数是 ...

  9. BZOJ 5496: [2019省队联测]字符串问题 (后缀数组+主席树优化建图+拓扑排序)

    题意 略 分析 考场上写了暴力建图40分溜了-(结果只得了30分) 然后只要优化建边就行了 首先给出的支配关系无法优化,就直接A向它支配的B连边. 考虑B向以B作为前缀的所有A连边,做一遍后缀数组,两 ...

随机推荐

  1. attr(),addClass()使用方法练习

    这次我主要是想要完成2个li之间样式的变化.方法比较傻,如果有人有更好的办法或者有别问题,希望可以不吝指教. <!DOCTYPE html><html> <head> ...

  2. Tornado 判断用户登录状态和操作权限(装饰器)

    判断是否登录: def authenticated(method): '''''' @functools.wraps(method) def wrapper(self, *args, **kwargs ...

  3. Luogu P2802 回家

    题目描述 小H在一个划分成了n*m个方格的长方形封锁线上. 每次他能向上下左右四个方向移动一格(当然小H不可以静止不动), 但不能离开封锁线,否则就被打死了. 刚开始时他有满血6点,每移动一格他要消耗 ...

  4. [POI2007]洪水pow 并查集

    我们先得出一个结论:水泵要建在城市上.因为如果在非城市上建能把其他一些城市抽干,那么在城市上建也是一个效果(自己画图感性理解一下) 然后我们明白抽水的条件:周围的高度要>=自身的高度,这样会抽完 ...

  5. mysql flush操作

    FLUSH语法 FLUSH [LOCAL | NO_WRITE_TO_BINLOG] flush_option [, flush_option] ... 如果您想要清除MySQL使用的部分内部缓存,您 ...

  6. .Net Reactor 5脱壳教程

    今天别人发来一个.Net的DLL让我脱壳,第一步自然是先扔进de4dot 我这个de4dot 是集成了  Ivancito0z / TheProxy / PC-RET 4.9mod / wuhenso ...

  7. 解析spring循环依赖策略

    循环依赖 所谓循环依赖就是多个Bean之间依赖关系形成一个闭环,例如A->B->C->...->A 这种情况,当然,最简单的循环依赖就是2个Bean之间互相依赖:A->B ...

  8. win7(iis7)无法加载运行CSS和图片的解决方法

    今天刚刚在公司的电脑安装了window7并配置了iis7,打开网站户发现结构混乱,图片不显示,但是内容显示完全没有问题,也没有出错. 一开始以为是和IIS6的MIME一样,没有添加到相应项目的原因,但 ...

  9. 给出打印结果-setTimeout

    问题: 请给出打印结果: for(var i=0;i<5;i++){ setTimeout(function(){ console.log(i); },0); } 解析: 考的是setTimeo ...

  10. markdownpad生成目录

    生成目录 document.addEventListener("DOMContentLoaded", function() { // 生成目录列表 var outline = do ...