原题模型:两者(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. Android性能测试工具Emmagee介绍

    Emmagee介绍 Emmagee是监控指定被测应用在使用过程中占用机器的CPU.内存.流量资源的性能测试小工具.该工具的优势在于如同windows系统性能监视器类似,它提供的是数据采集的功能,而行为 ...

  2. VFS分析(一)挂载(持续更新)

    基础知识在<深入linux内核架构>第8章,自行脑补. 看下几个关键的过程: do_add_mount里有重要函数lock_mount, lock_mount函数的输入是struct pa ...

  3. 哎呀,发现自己不会用模块的方式用kprobe啊,弱爆了

    在内核外面编译模块,会报warning函数名undefined的错误,解决方法是把函数给export出来:EXPORT_SYMBOL 一直以来,用kprobe比较多的是kprobe event的用法, ...

  4. mac终端命令大全介绍

    OSX 的文件系统 OSX 采用的Unix文件系统,所有文件都挂在跟目录 / 下面,所以不在要有Windows 下的盘符概念. 你在桌面上看到的硬盘都挂在 /Volumes 下. 比如接上个叫做 US ...

  5. 分享JS代码(转)

    var imgUrl = 'http://xxx/share_ico.png'; // 分享后展示的一张图片 var lineLink = 'http://xxx'; // 点击分享后跳转的页面地址 ...

  6. Unity架构有点乱

    1,没有合理的将公共的东西归入到基类中,而是分散到子类中,有许多重复. 比如 enbled的变量本应该是所有component所共有的一个属性,应该写在component.然而却发现并非这样,enbl ...

  7. js 与ios 交互的三种方法

    第一种:IOS拦截url  实现跳转 参考链接:http://www.cnblogs.com/pengyingh/articles/2354381.html IOS9.0 及以上支持 第二种:IOS ...

  8. Runtime类及其常用方法

    每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接.可以通过 getRuntime 方法获取当前运行时. 常用方法: 1.public static Runt ...

  9. ffplay 参数说明分享

    ffplay 使用参数说明分享 E:\SRCFORTEST\software\ffmpeg-20131021\ffmpeg-20131021-git-712eff4-win32-static\ bin ...

  10. Java 环境下使用 AES 加密的特殊问题处理

    在 Java 环境下使用 AES 加密,在密钥长度和字节填充方面有一些比较特殊的处理. 1. 密钥长度问题 默认 Java 中仅支持 128 位密钥,当使用 256 位密钥的时候,会报告密钥长度错误 ...