原题模型:两者(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. JMeter学习(三十二)属性和变量

    一.Jmeter中的属性: 1.JMeter属性统一定义在jmeter.properties文件中,我们可以在该文件中添加自定义的属性 2.JMeter属性在测试脚本的任何地方都是可见的(全局),通常 ...

  2. 转:webRTC的前世今生

    https://blog.coding.net/blog/getting-started-with-webrtc

  3. Android 手势识别类 ( 二 ) GestureDetector 源码浅析

    前言:Android 关于手势的操作提供两种形式:一种是针对用户手指在屏幕上划出的动作而进行移动的检测,这些手势的检测通过android提供的监听器来实现:另一种是用 户手指在屏幕上滑动而形成一定的不 ...

  4. 让input框只能输入数字

    var oInput = document.querySelector("input");oInput.onkeyup = function () { var value = th ...

  5. 在collection view中加入 NavigationController问题

    在开发过程中用collectionView集合视图的时候,用navgationController跳转会出现导航栏掩盖部分内容现象, 这时候需要在viewDidLoad里面填写 self.edgesF ...

  6. ST3插件——PlainTasks的使用

    今天看到一个有意思的ST3插件,可以进行简单的任务管理. 安装很简单:ctrl + shift + p,输入install回车,再输入plaintasks回车即可. 以下是一些支持的操作,更多的操作请 ...

  7. 编写高效的CSS选择符(节选)

    最右边优先 css选择符是从右向左进行匹配的. 样式系统从最右边的选择符开始向左匹配规则.只要当前的选择符的左边还有其他选择符,样式系统就会继续向左移动,直到找到和匹配的元素,或者因为不匹配而退出. ...

  8. CSS 动画之十-图片+图片信息展示

    这个动画主要是运用了一些css3的特性,效果是展示一张商品图片,然后在商品图片的制定位置显示该商品的详细信息.效果在chrome浏览器中预览. <!DOCTYPE html> <ht ...

  9. 关联规则算法(The Apriori algorithm)详解

    一.前言 在学习The Apriori algorithm算法时,参考了多篇博客和一篇论文,尽管这些都是很优秀的文章,但是并没有一篇文章详解了算法的整个流程,故整理多篇文章,并加入自己的一些注解,有了 ...

  10. aptana studio 3汉化方法 及支持jquery的方法

    之前看弦哥的 Asp.Net大型项目实践系列第二季(一)哥欲善其事,必先利其器 看到他介绍了aptana,好像用来学习js是个好工具... 因为不论你写什么,都会提示你它在各个浏览器中是否被支持... ...