poj 3683 2-SAT入门
原题模型:两者(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入门的更多相关文章
- 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 ...
- POJ 3683 Priest John's Busiest Day(2-SAT+方案输出)
Priest John's Busiest Day Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10010 Accep ...
- POJ 3683 Priest John's Busiest Day (2-SAT+输出可行解)
题目地址:POJ 3683 第一次做须要输出可行解的题目. . .大体思路是先用强连通来推断是否有可行解,然后用逆序建图.用拓扑排序来进行染色.然后输出可行解. 详细思路见传送门 由于推断的时候少写了 ...
- 2-SAT的小总结(POJ 3683 POJ 3207)
记住几个最重要的公式: xANDy=0<=>(x=>y′)AND(y=>x′) xANDy=1<=>(x′=>x)AND(y′=>y) xORy=0&l ...
- poj - 3683 - Priest John's Busiest Day(2-SAT)
题意:有N场婚礼,每场婚礼的开始时间为Si,结束时间为Ti,每场婚礼有个仪式,历时Di,这个仪式要么在Si时刻开始,要么在Ti-Di时刻开始,问能否安排每场婚礼举行仪式的时间,使主持人John能参加所 ...
- poj 3683(2-SAT+SCC)
传送门:Problem 3683 https://www.cnblogs.com/violet-acmer/p/9769406.html 参考资料: [1]:挑战程序设计竞赛 题意: 有n场婚礼,每场 ...
- poj 3683(2-sat+输出一组可行解)
题目链接:http://poj.org/problem?id=3683 思路:对于每个结婚仪式,只有在开始或结束时进行这两种选择,我们可以定义xi为真当且仅当在开始时进行.于是我们可以通过时间先后确定 ...
- POJ 3207 【2-SAT入门题 + 强连通分量】
这道题是我对于2-SAT问题的入门题:http://poj.org/problem?id=3207 一篇非常非常非常好的博客,很详细,认真看一遍差不多可以了解个大概:https://blog.csdn ...
- POJ 2342 树形DP入门题
有一个大学的庆典晚会,想邀请一些在大学任职的人来參加,每一个人有自己的搞笑值,可是如今遇到一个问题就是假设两个人之间有直接的上下级关系,那么他们中仅仅能有一个来參加,求请来一部分人之后,搞笑值的最大是 ...
随机推荐
- 解决-bash: lsb_release: command not found
今天想判断系统版本,没想到没有lsb_release,lsb_release是查看系统版本信息的工具.当然我们也可以用其他的命令来解决,但这个问题还是解决掉. 系统:centos 6.41.先检查有没 ...
- 爆炸吧 js dom ---------> boom
dom-> html css 事件 元素 eventlistener HTML 事件的例子: 当用户点击鼠标时 当网页已加载时 当图像已加载时 当鼠标移动到元素上时 当输入字段被改变时 当提交 ...
- where,having与 group by连用的区别
select 列a,聚合函数 from 表名 where 过滤条件 group by 列a having 过滤条件 group by 字句也和where条件语句结合在一起使用.当结合在一起时,wher ...
- 基于 URL 的权限控制
先不用框架,自己实现一下 数据库 /* SQLyog v10.2 MySQL - 5.1.72-community : Database - shiro *********************** ...
- 19Mybatis_订单商品数据模型分析
这篇文章是对订单商品数据模型进行分析(会给出分析思路),有四张表.这篇文章是后续文章的基础,因为后续的文章要针对这个数据模型(四张表)进行一对一,一对多,多对多进行查询. 我们以后会碰到各种各样的数据 ...
- .NET 常见的偏门问题
1.空格 一般情况下," " 的空格可能被过滤掉,在中文输入法中也同样. 有的人会使用2次空格,但是还是无法达到目的. 实现方法:" "的空格,这不是使用2次空 ...
- Linux中查看各文件夹大小命令du -h --max-depth=1
http://blog.csdn.net/ouyang_peng/article/details/10414499 du -h --max-depth=1
- 在ASP.Net和IIS中删除不必要的HTTP响应头
引入 每次当浏览器向Web服务器发起一个请求的时,都会伴随着一些HTTP头的发送.而这些HTTP头是用于给Web服务器提供一些额外信息以便于处理请求.比如说吧.如果浏览器支持压缩功能,则浏览器会发送A ...
- 配置错误定义了重复的“system.web.extensions/scripting/scriptResourceHandler” 解决办法
今天遇到了这个问题, 电脑系统:vs2010 win7系统 iis7 我运行在iis中配置的那个网站后,报错:错误代码 0x800700b7 配置错误定义了重复的“system.web.extensi ...
- opencv中的图像复制、保存和显示
接下来几天会写一个opencv的基础系列,与各位相互学习! &1 图像操作 声明图像指针:IplImage* 读入图像: cvLoadImage 创建图像:cvCreateImage 复制图像 ...