原题模型:两者(A,B)不能同时取

 #include "cstdio"
#include "vector"
#include "stack"
#include "cstring"
using namespace std;
#define maxn 2010 int n,N,dfs_clock,scc_cnt,v,tt=;
char st[];
int S[maxn],T[maxn],D[maxn],pre[maxn],sccno[maxn],lowlink[maxn],id[maxn],cfl[maxn],color[maxn],done[maxn];
int G[maxn][maxn],G2[maxn][maxn];
stack<int> St; void tarjan(int u)
{
pre[u]=lowlink[u]=++dfs_clock;
St.push(u);
for (int i=;i<=G[u][];i++)
{
int v=G[u][i];
if (!pre[v])
{
tarjan(v);
lowlink[u]=min(lowlink[u],lowlink[v]);
}
else if (!sccno[v])
{
lowlink[u]=min(lowlink[u],pre[v]);
}
}
if (lowlink[u]==pre[u])
{
scc_cnt++;
for (;;)
{
int x=St.top();
St.pop();
sccno[x]=scc_cnt;
if (x==u) break;
}
}
} void find_scc(int n)
{
dfs_clock=scc_cnt=;
memset(sccno,,sizeof(sccno));
memset(pre,,sizeof(pre));
for (int i=;i<=n;i++)
if (!pre[i])
tarjan(i);
} void add_edge(int x,int y)
{
G[x][]++;
G[x][G[x][]]=y;
} void _add_edge(int x,int y)
{
G2[x][]++;
G2[x][G2[x][]]=y;
} void solve()
{
//1->N:x[i] N+1->2N:not x[i]
v=N*;
for (int i=;i<=N;i++)
{
for (int j=i+;j<=N;j++)
{
if (min(S[i]+D[i],S[j]+D[j])>max(S[i],S[j])) //事件i和j不能同时满足,连边
{
add_edge(i,N+j);
add_edge(j,N+i);
}
if (min(S[i]+D[i],T[j])>max(S[i],T[j]-D[j]))
{
add_edge(i,j);
add_edge(N+j,N+i);
}
if (min(T[i],S[j]+D[j])>max(T[i]-D[i],S[j]))
{
add_edge(N+i,N+j);
add_edge(j,i);
}
if (min(T[i],T[j])>max(T[i]-D[i],T[j]-D[j]))
{
add_edge(N+i,j);
add_edge(N+j,i);
}
}
}
} void topsort(int x)
{
int j;
id[x] = -;
done[++tt]=x;
for(int k=;k<=G2[x][];k++)
{
j = G2[x][k];
id[j]--;
if( id[j] == ) topsort( j );
}
} void dfs( int i )
{
int j;
color[i] = ;
for(int k=;k<=G[i][];k++)
{
j = G2[i][k];
if( color[j] == ) dfs( j );
}
} void print( int aa, int bb )
{
if( aa / < ) printf( "" );
printf( "%d:", aa / );
if( aa % < ) printf( "" );
printf( "%d ", aa % );
if( bb / < ) printf( "" );
printf( "%d:", bb / );
if( bb % < ) printf( "" );
printf( "%d\n", bb % );
} int main()
{
scanf("%d",&N);
for( int i = ; i <= N; i++ ) //时间统一转化成分钟存储
{
scanf( "%s", st );
S[i] = ( st[]- )* + ( st[]- )*;
S[i] += ( st[]- )* + st[]-;
scanf( "%s", st );
T[i] = ( st[]- )* + ( st[]- )*;
T[i] += ( st[]- )* + st[]-;
scanf( "%d", &D[i] );
} solve();
find_scc(*N); for (int i=;i<=N;i++)
{
if (sccno[i]==sccno[N+i])
{
printf("NO\n");
return ;
}
} //printf("YES\n");
for (int i=;i<=*N;i++) //强连通分量缩点并对块反向连边
{
for (int j=;j<=G[i][];j++)
{
int tm=G[i][j];
if (sccno[i]!=sccno[tm])
{
_add_edge(sccno[tm],sccno[i]);
id[sccno[i]]++;
}
}
}
for (int i=;i<=scc_cnt;i++) //对缩点之后的块拓扑排序,
if (id[i]==)
topsort(i); for( int i = ; i <= N; i++ )
{
cfl[ sccno[i] ] = sccno[i+N];
cfl[ sccno[i+N] ] = sccno[i];
} for( int ii = ; ii <= scc_cnt; ii++ ) //按拓扑序对块染色,求方案
{
int i = done[ii]; //done[]:拓扑序列
if( color[i] != ) continue;
color[i] = ; //color[]=1:选刚开始的时段,S~S+D
dfs( cfl[i] ); //color[]=2:选结束的时段,T-D~T
}
printf("YES\n");
for( int i = ; i <= N; i++ )
if( color[ sccno[i] ] == )
print( S[i], S[i]+D[i] );
else
print( T[i]-D[i], T[i] ); return ;
} //一直觉得ICPC不应该是种功利性的东西,那样就彻底变味了,也没意义了
//今年要干就好好干吧,也许明年就不打了
//没办法,有些事太复杂
//反正个人认为几个真心的朋友比所谓的成绩重要得多得多。
//。
//就这样吧

poj 3683 2-SAT入门的更多相关文章

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

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

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

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

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

  4. 2-SAT的小总结(POJ 3683 POJ 3207)

    记住几个最重要的公式: xANDy=0<=>(x=>y′)AND(y=>x′) xANDy=1<=>(x′=>x)AND(y′=>y) xORy=0&l ...

  5. poj - 3683 - Priest John's Busiest Day(2-SAT)

    题意:有N场婚礼,每场婚礼的开始时间为Si,结束时间为Ti,每场婚礼有个仪式,历时Di,这个仪式要么在Si时刻开始,要么在Ti-Di时刻开始,问能否安排每场婚礼举行仪式的时间,使主持人John能参加所 ...

  6. poj 3683(2-SAT+SCC)

    传送门:Problem 3683 https://www.cnblogs.com/violet-acmer/p/9769406.html 参考资料: [1]:挑战程序设计竞赛 题意: 有n场婚礼,每场 ...

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

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

  8. POJ 3207 【2-SAT入门题 + 强连通分量】

    这道题是我对于2-SAT问题的入门题:http://poj.org/problem?id=3207 一篇非常非常非常好的博客,很详细,认真看一遍差不多可以了解个大概:https://blog.csdn ...

  9. POJ 2342 树形DP入门题

    有一个大学的庆典晚会,想邀请一些在大学任职的人来參加,每一个人有自己的搞笑值,可是如今遇到一个问题就是假设两个人之间有直接的上下级关系,那么他们中仅仅能有一个来參加,求请来一部分人之后,搞笑值的最大是 ...

随机推荐

  1. 解决-bash: lsb_release: command not found

    今天想判断系统版本,没想到没有lsb_release,lsb_release是查看系统版本信息的工具.当然我们也可以用其他的命令来解决,但这个问题还是解决掉. 系统:centos 6.41.先检查有没 ...

  2. 爆炸吧 js dom ---------> boom

    dom-> html css 事件 元素 eventlistener HTML 事件的例子: 当用户点击鼠标时 当网页已加载时 当图像已加载时 当鼠标移动到元素上时 当输入字段被改变时 当提交 ...

  3. where,having与 group by连用的区别

    select 列a,聚合函数 from 表名 where 过滤条件 group by 列a having 过滤条件 group by 字句也和where条件语句结合在一起使用.当结合在一起时,wher ...

  4. 基于 URL 的权限控制

    先不用框架,自己实现一下 数据库 /* SQLyog v10.2 MySQL - 5.1.72-community : Database - shiro *********************** ...

  5. 19Mybatis_订单商品数据模型分析

    这篇文章是对订单商品数据模型进行分析(会给出分析思路),有四张表.这篇文章是后续文章的基础,因为后续的文章要针对这个数据模型(四张表)进行一对一,一对多,多对多进行查询. 我们以后会碰到各种各样的数据 ...

  6. .NET 常见的偏门问题

    1.空格 一般情况下," " 的空格可能被过滤掉,在中文输入法中也同样. 有的人会使用2次空格,但是还是无法达到目的. 实现方法:" "的空格,这不是使用2次空 ...

  7. Linux中查看各文件夹大小命令du -h --max-depth=1

    http://blog.csdn.net/ouyang_peng/article/details/10414499 du -h --max-depth=1  

  8. 在ASP.Net和IIS中删除不必要的HTTP响应头

    引入 每次当浏览器向Web服务器发起一个请求的时,都会伴随着一些HTTP头的发送.而这些HTTP头是用于给Web服务器提供一些额外信息以便于处理请求.比如说吧.如果浏览器支持压缩功能,则浏览器会发送A ...

  9. 配置错误定义了重复的“system.web.extensions/scripting/scriptResourceHandler” 解决办法

    今天遇到了这个问题, 电脑系统:vs2010 win7系统 iis7 我运行在iis中配置的那个网站后,报错:错误代码 0x800700b7 配置错误定义了重复的“system.web.extensi ...

  10. opencv中的图像复制、保存和显示

    接下来几天会写一个opencv的基础系列,与各位相互学习! &1 图像操作 声明图像指针:IplImage* 读入图像: cvLoadImage 创建图像:cvCreateImage 复制图像 ...