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 ...
随机推荐
- Xml文档数据提取到Excel表中
近期,财务一位同事,吐槽:<某XX开票软件>导出数据文档只有Xml格式,竟然没有Excel文档,工作起来非常不方便,希望我想想办法.上图: 需求分析:Xml数据----> 提取到Da ...
- PHP的加密方式
1. MD5加密 string md5 ( string $str [, bool $raw_output = false ] ) 参数 str -- 原始字符串. raw_output -- ...
- AJPFX总结集合的概念
//java 中集合的概述========================================================== 集合的概念: 为 ...
- 8.bootstrap下拉菜单、按钮组、按钮式下拉菜单
下拉菜单 dropdown 对齐方式: .dropdown-menu-right .dropdown-menu-left <div class="container" ...
- logging模块进阶2
1.两种级别设置: 全局级别:生成logger对象后设置的级别 局部级别:生成handler对象设置的级别 我们都知道输出的级别不能低于设定的级别,那么全局级别和局部级别哪一个对输出产生影响? 经过多 ...
- NestedScrollView嵌套RecycleView发生的小问题
1.解决方法:嵌套滑动不激活. recycleView.setNestedScrollingEnable(false); 这样做有个弊端,RecycleView的item会一次性加载完,不管是否显示, ...
- mysql出错排查
1,例如:Can't connect to local MySQL server through socket '/tmp/mysql-5.5.37.sock' (2) Mysql链接出错,请配置/A ...
- 洛谷 P1163 银行贷款
题目描述 当一个人从银行贷款后,在一段时间内他(她)将不得不每月偿还固定的分期付款.这个问题要求计算出贷款者向银行支付的利率.假设利率按月累计. 输入输出格式 输入格式: 输入文件仅一行包含三个用空格 ...
- 2019年今日头条机试_JAVA后台岗_第一题
广度优先遍历: import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; class Nod ...
- PHP24 自定义分页类
分页类的定义 <?php /** * Class MyPage 分页类 * @package core */ class MyPage { private $totalCount; //数据表中 ...