2-sat按照最小字典序输出可行解(hdu1814)
Peaceful Commission
The Commission has to fulfill the following conditions:
1.Each party has exactly one representative in the Commission,
2.If two deputies do not like each other, they cannot both belong to the Commission.
Each party has exactly two deputies in the Parliament. All of them are numbered from 1 to 2n. Deputies with numbers 2i-1 and 2i belong to the i-th party .
Task
Write a program, which:
1.reads from the text file SPO.IN the number of parties and the pairs of deputies that are not on friendly terms,
2.decides whether it is possible to establish the Commission, and if so, proposes the list of members,
3.writes the result in the text file SPO.OUT.
In each of the following m lines there is written one pair of integers a and b, 1 <= a < b <= 2n, separated by a single space. It means that the deputies a and b do not like each other.
There are multiple test cases. Process to end of file.
from 1 to 2n, written in the ascending order, indicating numbers of deputies who can form the Commission. Each of these numbers should be written in a separate line. If the Commission can be formed in various ways, your program may write mininum number sequence.
1 3
2 4
4
5
#include"stdio.h"
#include"string.h"
#include"stdlib.h"
#include"queue"
#include"algorithm"
#include"string.h"
#include"string"
#include"map"
#define inf 0x3f3f3f3f
#define M 16009
using namespace std;
struct node
{
int u,v,next;
}edge[M*20];
int t,head[M],s[M],color[M],cnt;
void init()
{
t=0;
memset(head,-1,sizeof(head));
}
void add(int u,int v)
{
edge[t].v=v;
edge[t].next=head[u];
head[u]=t++;
}
int dfs(int u)
{
if(color[u]==1)
return 1;
if(color[u]==-1)
return 0;
s[cnt++]=u;
color[u]=1;
color[u^1]=-1;
for(int i=head[u];i!=-1;i=edge[i].next)
{
int v=edge[i].v;
if(!dfs(v))
return 0;
}
return 1;
}
int psq(int n)
{
memset(color,0,sizeof(color));
for(int i=0;i<2*n;i++)
{
if(color[i])continue;
cnt=0;
if(!dfs(i))
{
for(int j=0;j<cnt;j++)
color[s[j]]=color[s[j]^1]=0;
if(!dfs(i^1))
return 0;
}
}
return 1;
}
int main()
{
int n,m,i;
while(scanf("%d%d",&n,&m)!=-1)
{
init();
for(i=1;i<=m;i++)
{
int a,b;
scanf("%d%d",&a,&b);
a--;
b--;
add(a,b^1);
add(b,a^1);
}
if(psq(n))
{
for(i=0;i<2*n;i++)
if(color[i]==1)
printf("%d\n",i+1);
}
else
printf("NIE\n");
}
}
#include"stdio.h"
#include"algorithm"
#include"string.h"
#include"iostream"
#include"queue"
#include"map"
#include"stack"
#include"cmath"
#include"vector"
#include"string"
#define M 20009
#define N 20003
#define eps 1e-7
#define mod 123456
#define inf 100000000
using namespace std;
struct node
{
int v,r;
node(){}
node(int v,int r)
{
this->v=v;
this->r=r;
}
bool operator<(const node &a)const
{
return r>a.r;
}
};
struct st
{
int u,v,next;
}edge[M*];
int t,indx,num;
int head[M],low[M],dfn[M],in[M],belong[M],fp[M],top[M],use[M],color[M],mark[M],cnt;
stack<int>q;
void init()
{
t=;
memset(head,-,sizeof(head));
}
void add(int u,int v)
{
edge[t].u=u;
edge[t].v=v;
edge[t].next=head[u];
head[u]=t++;
}
void tarjan(int u)
{
dfn[u]=low[u]=++indx;
q.push(u);
use[u]=;
for(int i=head[u];~i;i=edge[i].next)
{
int v=edge[i].v;
if(!dfn[v])
{
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(use[v])
{
low[u]=min(low[u],dfn[v]);
}
}
if(low[u]==dfn[u])
{
++num;
int v;
top[num]=inf;
do
{
v=q.top();
q.pop();
belong[v]=num;
top[num]=min(top[num],v);
use[v]=;
}while(v!=u);
}
}
int solve(int n)
{
num=indx=;
memset(dfn,,sizeof(dfn));
memset(use,,sizeof(use));
for(int i=;i<=n*;i++)
if(!dfn[i])
tarjan(i);
for(int i=;i<=n;i++)
{
if(belong[i*-]==belong[i*])
return ;
}
return ;
}
int op(int u)
{
if(u&)
return u+;
return u-;
}
int dfs(int u)
{
mark[++cnt]=u;
color[u]=;
color[op(u)]=-;
for(int i=head[u];~i;i=edge[i].next)
{
int v=edge[i].v;
if(color[v]==-)
return ;
if(color[v]==)
{
if(dfs(v))
return ;
}
}
return ;
}
int main()
{
int n,m,a,b;
while(scanf("%d%d",&n,&m)!=-)
{
init();
for(int i=;i<=m;i++)
{
scanf("%d%d",&a,&b);
if((a&)&&(b&))
{
add(a,b+);
add(b,a+);
}
else if((a&)&&!(b&))
{
add(a,b-);
add(b,a+);
}
else if(!(a&)&&(b&))
{
add(a,b+);
add(b,a-);
}
else
{
add(a,b-);
add(b,a-);
}
}
int msg=solve(n);
if(!msg)
{
printf("NIE\n");
continue;
}
memset(color,,sizeof(color));
for(int i=;i<=n*;i++)
{
if(!color[i])
{
cnt=;
int tt=dfs(i);
if(tt)
{
for(int j=;j<=cnt;j++)
color[mark[j]]=color[op(mark[j])]=;
}
}
}
for(int i=;i<=*n;i++)
{
if(color[i]==)
printf("%d\n",i);
}
}
return ;
}
2-sat按照最小字典序输出可行解(hdu1814)的更多相关文章
- TZOJ 5110 Pollutant Control(边数最少最小割最小字典序输出)
描述 It's your first day in Quality Control at Merry Milk Makers, and already there's been a catastrop ...
- HDU1814(Peaceful Commission) 【2-SAT DFS暴力求最小字典序的模板】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1814 题意:给出一个数n,代表有n个党派,每个党派要求派出其中一个人去参加会议,且只能派出一人.给出m ...
- POJ 2337 Catenyms(欧拉回(通)路:路径输出+最小字典序)
题目链接:http://poj.org/problem?id=2337 题目大意:给你n个字符串,只有字符串首和尾相同才能连接起来.请你以最小字典序输出连接好的单词. 解题思路:跟POJ1386一个意 ...
- [ACM_模拟] ZJUT 1155 爱乐大街的门牌号 (规律 长为n的含k个逆序数的最小字典序)
Description ycc 喜欢古典音乐是一个 ZJUTACM 集训队中大家都知道的事情.为了更方便地聆听音乐,最近 ycc 特意把他的家搬到了爱乐大街(德语Philharmoniker-Stra ...
- Catenyms POJ - 2337(单词+字典序输出路径)
题意: 就是给出几个单词 看能否组成欧拉回路或路径 当然还是让输出组成的最小字典序的路 解析: 还是把首尾字母看成点 把单词看成边 记录边就好了 这题让我对fleury输出最小字典序又加深了一些 ...
- 3532: [Sdoi2014]Lis 最小字典序最小割
3532: [Sdoi2014]Lis Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 865 Solved: 311[Submit][Status] ...
- HDU - 5324:Boring Class (CDQ分治&树状数组&最小字典序)
题意:给定N个组合,每个组合有a和b,现在求最长序列,满足a不升,b不降. 思路:三位偏序,CDQ分治. 但是没想到怎么输出最小字典序,我好菜啊. 最小字典序: 我们倒序CDQ分治,ans[i]表 ...
- 【2-SAT(最小字典序/暴力染色)】HDU1814-Peaceful Commission
[题目大意] 和平委员会每个党派有2个人,只能派出其中1个,其中有一些人之间互相讨厌不能同时派出.求出派遣方案,如果有多种方案输出字典序最小的方案. [思路] 最小字典序只能用暴力染色.初始时均没有染 ...
- UVa 1584 Circular Sequence(环形串最小字典序)
题意 给你一个环形串 输出它以某一位为起点顺时针得到串的最小字典序 直接模拟 每次后移一位比較字典序就可以 注意不能用strcpy(s+1,s)这样后移 strcpy复制地址不能有重叠部 ...
随机推荐
- ajax+jsp自动刷新
通过 AJAX,JavaScript 可使用 JavaScript 的 XMLHttpRequest 对象来直接与服务器进行通信.通过这个对象, JavaScript 可在不重载页面的情况与 Web ...
- 【转】C# 解析JSON方法总结
http://blog.csdn.net/jjhua/article/details/51438317 主要参考http://blog.csdn.NET/joyhen/article/details/ ...
- 【转】一篇很全面的freemarker教程---有空慢慢实践
FreeMarker的模板文件并不比HTML页面复杂多少,FreeMarker模板文件主要由如下4个部分组成: 1,文本:直接输出的部分 2,注释:<#-- ... -->格式部分,不会输 ...
- c signal
信号是Linux编程中非常重要的部分,本文将详细介绍信号机制的基本概念.Linux对信号机制的大致实现方法.如何使用信号,以及有关信号的几个系统调用. 信号机制是进程之间相互传递消息的一种方法,信号全 ...
- 使用dnspod进行简单的HTTP dns解析(防劫持)
https://www.dnspod.cn/httpdns/guide https://www.dnspod.cn/misc/D%2B免费版本接口说明.pdf 最简单的get接口去请求dnspod提供 ...
- 用Java操作树莓派!pi4j简介与安装
简介 对C不熟?习惯了使用java不想换语言,但又想操作树莓派?想一边喝咖啡,一边吃树莓派蛋糕?快来使用pi4j吧! pi4j旨在为java开发者提供面友好的面向对象的API,来操控树莓派.pi4j对 ...
- Simplest way to serve static data from outside the application server in a Java web application
tomcat service.xml <Context docBase="/path/to/images" path="/images" /> re ...
- Qt之窗体拖拽、自适应分辨率、自适应大小 good
Qt之自定义界面(实现无边框.可移动) Qt之自定义界面(窗体缩放-跨平台终极版) Qt之自定义界面(窗体缩放) http://blog.csdn.net/liang19890820/article/ ...
- Window上装PHP开发环境 (XAMPP)
原作者:http://www.cnblogs.com/martin1009/archive/2011/11/11/2245794.html 1. 从www.apachefriends.org 上下载X ...
- KVO机制浅析和实例演示
什么是KVO? KVO是Key-Value-Observing的缩写,通过KVO这种机制对象可以通过它得到其他对象的某个属性的变更通知.这种机制在MVC模式下显得更为重要,KVO可以让视图对象经过控制 ...