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复制地址不能有重叠部 ...
随机推荐
- 【转】NGUI创建UIRoot后报NullReferenceException的解决办法
本文参考自 http://forum.china.unity3d.com/thread-1099-1-1.html 使用NGUI版本3.7.5. 在创建了一个UIRoot后,有时会报NullRefer ...
- http://d3js.org/
http://d3js.org/ http://www.ourd3js.com/wordpress/?p=51 http://www.ourd3js.com/wordpress/?p=104file: ...
- phpCAS::handleLogoutRequests()关于java端项目登出而php端项目检测不到的测试
首先,假如你有做过cas,再假如你的cas里面有php项目,这个时候要让php项目拥有cas的sso功能,你需要改造你的项目,由于各人的项目不同,但是原理差不多,都是通过从cas服务器获取sessio ...
- CRUD操作 create创建 read读取 update修改 delete删除
1.注释语法:--,#2.后缀是.sql的文件是数据库查询文件3.保存查询4.在数据库里面 列有个名字叫字段 行有个名字叫记录 CRUD操作:create 创建(添加)read 读取update 修改 ...
- jfinal框架教程-学习笔记(二)
上一节介绍了jfinal框架的简单搭建,这节通过一个小例子了解jfinal的结构和特点 先上图 1.建数据库(我用的是oracle数据库,其他的相对也差不多) -- Create table crea ...
- nodejs net模块实现socket
var net = require('net'); var client = net.connect({port: 8080}, function() { console.log('连接到服务器!') ...
- JMeter学习-008-JMeter 后置处理器实例之 - 正则表达式提取器(一)概述及简单实例
上文我们讲述了如何对 HTTP请求 的响应数据进行断言,以判断响应是否符合我们的预期,敬请参阅:JMeter学习-007-JMeter 断言实例之一 - 响应断言 那么我们如何获取 HTTP请求 响应 ...
- boost.compressed_pair源码剖析
意义 当compressed_pair的某一个模板参数为一个空类的时候将对其进行“空基类优化”,这样可以使得compressed_pair占用的空间比std::pair的更小. 参考如下代码: #in ...
- android xUtils get post
使用android xUtils框架,进行http的get和post验证. 参考链接: https://github.com/wyouflf/xUtils3 http://blog.csdn.net/ ...
- Java Main Differences between Java and C++
转载自:http://www.cnblogs.com/springfor/p/4036739.html C++ supports pointers whereas Java does not. But ...