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复制地址不能有重叠部 ...
随机推荐
- http响应状态码301和302
HTTP返回码中301与302的区别 (2012-10-15 22:06:09) 一.官方说法 301,302 都是HTTP状态的编码,都代表着某个URL发生了转移,不同之处在于: 301 redir ...
- Java 实现导出excel表 POI
1.首先下载poi-3.6-20091214.jar 2.Student.java import java.util.Date; public class Student { private int ...
- [LeetCode]题解(python):035-Search Insert Position
题目来源 https://leetcode.com/problems/search-insert-position/ Given a sorted array and a target value, ...
- 面向对象分析方法(I)
找出最关键的一些业务场景:一般通过动词来寻找,比如招聘系统中,一个应聘人投递一个职位就是一次应聘,应聘就是一个业务场景:一个学生参加某门课的考试,那么考试就是一个业务场景:一个学生去图书馆借书,那么借 ...
- Java学习-026-类名或方法名应用之二 -- 统计分析基础
前文讲述了类名或方法的应用之一调试源码,具体请参阅:Java学习-025-类名或方法名应用之一 -- 调试源码 此文主要讲述类名或方法应用之二统计分析,通过在各个方法中插桩(调用桩方法),获取方法的调 ...
- 我的工具箱之Opera浏览器
下载地址:http://pan.baidu.com/s/1gdVQA11 刚出来时挺火的,后来有点渐趋式微了.
- http://blog.csdn.net/foreverling/article/details/51385128
http://blog.csdn.net/foreverling/article/details/51385128
- 使用weave实现跨主机docker容器互联
关于weave的原理不做细致的说明,如果想了解weave可以登陆官网:https://www.weave.works/ In this post,使用阿里云3台ECS服务器进行weave搭建,并测试搭 ...
- 美国大学排名之本科中最用功的学校top15
美国大学排名之本科中最用功的学校top15 威久留学2016-07-29 13:15:59美国留学 留学新闻 留学选校阅读(490)评论(1) 去美国留学的同学可能都知道USnews美国大学排名, ...
- Android 用Animation-list实现逐帧动画
第一步:先上图片素材,以下素材放到res/drawable目录下: http://blog.csdn.net/aminfo/article/details/7847761 图片素材: 文件名称: ic ...