poj 3683 2-sat问题,输出任意一组可行解
/*
2sat问题
输出任意一组可行解
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
#define N 2100
struct node {
int u,v,next;
}ff[N],bian[N*N*8];
int head[N],yong,low[N],dfn[N],belong[N],ans,top,index,stac[N],vis[N];
void init()
{
memset(head,-1,sizeof(head));
yong=index=ans=top=0;
memset(vis,0,sizeof(vis));
memset(dfn,0,sizeof(dfn));
}
void addedge(int u,int v)
{
bian[yong].u=u;//有的时候不能少,因为下面要用到
bian[yong].v=v;
bian[yong].next=head[u];
head[u]=yong++;
}
void tarjan(int u)
{
low[u]=dfn[u]=++index;
stac[++top]=u;
vis[u]=1;
int i;
for(i=head[u]; i!=-1; i=bian[i].next)
{
int v=bian[i].v;
if(!dfn[v])
{
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(vis[v])
low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u])
{
ans++;
int t;
do
{
t=stac[top--];
belong[t]=ans;
vis[t]=0;
}
while(t!=u);
}
}
int slove(int n)
{
int i;
for(i=0; i<n*2; i++)
if(!dfn[i])
tarjan(i);
// printf("%d\n",ans);
for(i=0; i<n; i++)
if(belong[i]==belong[i+n])
return 0;
return 1;
}
int judge(struct node a,struct node b) {
if(a.v<=b.u||b.v<=a.u)
return 0;
return 1;
}
int fp[N],indegree[N],color[N];
vector<int>q[N];
void print(struct node a) {
printf("%02d:%02d %02d:%02d\n",a.u/60,a.u%60,a.v/60,a.v%60);
}
void oper(int n) {
int i;
for(i=0;i<n;i++) {
fp[belong[i]]=belong[i+n];
fp[belong[i+n]]=belong[i];
}
for(i=1;i<=ans;i++) {
q[i].clear();
color[i]=0;
indegree[i]=0;
}
for(i=0;i<yong;i++) {
int aa=bian[i].u;
int bb=bian[i].v;
if(belong[aa]!=belong[bb]) {
q[belong[bb]].push_back(belong[aa]);
indegree[belong[aa]]++;
}
}
queue<int>qq;
for(i=1;i<=ans;i++) {
if(indegree[i]==0)
qq.push(i);
}
while(!qq.empty()) {
int cur=qq.front();
qq.pop();
if(color[cur]==0) {
color[cur]=1;
color[fp[cur]]=2;
}
for(i=0;i<(int)q[cur].size();i++) {
int v=q[cur][i];
if(--indegree[v]==0)
qq.push(v);
}
}
for(i=0;i<n;i++) {
if(color[belong[i]]==1)
print(ff[i]);
else
print(ff[i+n]);
}
}
int main() {
int n,i,j,k,u,v,uu,vv,d;
while(scanf("%d",&n)!=EOF) {
for(i=0;i<n;i++) {
scanf("%d:%d %d:%d%d",&u,&v,&uu,&vv,&d);
j=u*60+v;
k=uu*60+vv;
ff[i].u=j;ff[i].v=j+d;
ff[i+n].u=k-d;ff[i+n].v=k;
}
init();
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++) {
if(judge(ff[i],ff[j])) {
addedge(i,j+n);
addedge(j,i+n);
}
if(judge(ff[i],ff[j+n])) {
addedge(i,j);
addedge(j+n,i+n);
}
if(judge(ff[i+n],ff[j])) {
addedge(i+n,j+n);
addedge(j,i);
}
if(judge(ff[i+n],ff[j+n])) {
addedge(i+n,j);
addedge(j+n,i);
}
}
if(!slove(n)) {
printf("NO\n");
continue;
}
printf("YES\n");
oper(n);
}
return 0;}
poj 3683 2-sat问题,输出任意一组可行解的更多相关文章
- 2-sat 输出任意一组可行解&拓扑排序+缩点 poj3683
Priest John's Busiest Day Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 8170 Accept ...
- HDU 1507 Uncle Tom's Inherited Land*(二分匹配,输出任意一组解)
Uncle Tom's Inherited Land* Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (J ...
- 洛谷 P4174 [NOI2006]最大获利 && 洛谷 P2762 太空飞行计划问题 (最大权闭合子图 && 最小割输出任意一组方案)
https://www.luogu.org/problemnew/show/P4174 最大权闭合子图的模板 每个通讯站建一个点,点权为-Pi:每个用户建一个点,点权为Ci,分别向Ai和Bi对应的点连 ...
- poj 3648 2-sat 输出任意一组解模板
转载地址:http://blog.csdn.net/qq172108805/article/details/7603351 /* 2-sat问题,题意:有对情侣结婚,请来n-1对夫妇,算上他们自己共n ...
- POJ 3683 Priest John's Busiest Day (2-SAT+输出可行解)
题目地址:POJ 3683 第一次做须要输出可行解的题目. . .大体思路是先用强连通来推断是否有可行解,然后用逆序建图.用拓扑排序来进行染色.然后输出可行解. 详细思路见传送门 由于推断的时候少写了 ...
- POJ 3683 Priest John's Busiest Day (2-SAT)
Priest John's Busiest Day Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 6900 Accept ...
- poj 3683(2-sat+输出一组可行解)
题目链接:http://poj.org/problem?id=3683 思路:对于每个结婚仪式,只有在开始或结束时进行这两种选择,我们可以定义xi为真当且仅当在开始时进行.于是我们可以通过时间先后确定 ...
- 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 / 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 ...
随机推荐
- UGUI_屏幕适配
引用:http://www.xuanyusong.com/archives/3278#comments 1.可以选择的有三种: 1.Screen Space – overlay 此模式不需要UI摄像 ...
- P1482 Cantor表(升级版)
题目描述 现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的.他是用下面这一张表来证明这一命题的: 1/1 1/2 1/3 1/4 1/5 … 2/1 2/2 2/3 2/4 … ...
- 【ADO.NET】 基础 (SQL Server)
一.Web.config配置 <connectionStrings> <add name="constr_name" connectionString=" ...
- EmitMapper系列之二:EmitMapper的使用小结
EmitMapper的入门 EmitMapper引用 EmitMapper案例 最近公司开发项目前端使用一个js框架,后端使用ef,js前台读取的json采用实体的dto来进行生成. 在网上看到了Em ...
- Log4net系列一:Log4net搭建之文本格式输出
Log4net简介 前言 项目开发中,记录项目日志是必须的,如果非要说日志的重要性(日志可看做,飞机的黑匣子,或者汽车的行车记录仪),根据等级进行记录,方便我们排查相关问题,以后项目运维中,也方便很多 ...
- repeater使用
Repeater: HeaderTemplate - 在加载开始执行一遍 ItemTemplate - 有多少条数据,执行多少遍 FooterTemplate - 在加载最后执行一遍 Alternat ...
- hihocoder1718 最长一次上升子序列
思路: 对于每个i,分别求1~i和i+1~N两部分的最长下降子序列“拼”起来,最终取最大长度即可.学习了如何使用BIT把LIS问题O(N2)算法优化为O(Nlog(N))的算法. https://ww ...
- poj2385 Apple Catching
思路: 简单dp. 实现: #include <iostream> #include <cstdio> #include <cstring> using names ...
- 【学习笔记】深入理解js原型和闭包(17)——补this
本文对<深入理解js原型和闭包(10)——this>一篇进行补充,原文链接:https://www.cnblogs.com/lauzhishuai/p/10078307.html 原文中, ...
- PMP项目管理学习笔记(11)——范围管理之定义范围
定义范围过程组 定义范围包含将项目分解为团队成员要完成的具体工作之前你需要知道的所有一切. 输入:需求文档.项目章程.组织过程资产 工具:辅助工作室.产品分析.代理方案识别.专家判断 辅助工作室: 与 ...