hdu 1814 2-sat 输出字典最小的和任意序列的 模板题
- /*
- 思路:http://blog.csdn.net/string_yi/article/details/12686873
- hdu 1814 输出字典序最小的2-sat
- */
- #include<stdio.h>
- #include<string.h>
- #include<math.h>
- #define N 16100
- #define NN 210000
- struct node {
- int v,w,next;
- }bian[NN*2];
- int head[N],cnt,yong,color[N],ans[N];
- void init() {
- yong=0;
- memset(head,-1,sizeof(head));
- yong=0;
- memset(color,0,sizeof(color));
- }
- void addedge(int u,int v) {
- bian[yong].v=v;
- bian[yong].next=head[u];
- head[u]=yong++;
- }
- int dfs(int v)
- {
- if(color[v]==2)
- return 0;
- if(color[v]==1)
- return 1;
- ans[cnt++]=v;
- color[v]=1;
- color[v^1]=2;
- for(int i=head[v];i!=-1;i=bian[i].next)
- if(!dfs(bian[i].v))
- return 0;
- return 1;
- }
- void slove(int n) {
- int i,j;
- for(i=0;i<2*n;i++) {
- if(color[i])continue;
- cnt=0;
- if(!dfs(i)) {
- for(j=0;j<cnt;j++) {
- color[ans[j]]=0;
- color[ans[j]^1]=0;
- }
- if(!dfs(i^1)) {
- printf("NIE\n");
- return ;
- }
- }
- }
- for(i=0;i<2*n;i+=2) {
- if(color[i]==1)
- printf("%d\n",i+1);
- else
- printf("%d\n",i+2);
- }
- }
- int main() {
- int n,aa,bb,m;
- while(scanf("%d%d",&n,&m)!=EOF) {
- init();
- while(m--) {
- scanf("%d%d",&aa,&bb);
- aa--;bb--;
- addedge(aa,bb^1);
- addedge(bb,aa^1);
- }
- slove(n);
- }
- return 0;}
- 输出任意次序<pre name="code" class="cpp">/*
- hit 1917输出任意次序的2-sat
- */
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- #include <cmath>
- #include <queue>
- #include <vector>
- using namespace std;
- const int maxn=16005;
- const int maxm=200005;
- int head[maxn],next[maxm],to[maxm];
- int dfn[maxn],low[maxn],stk[maxn],scc[maxn],ind[maxn],vis[maxn];
- int color[maxn],f[maxn];
- int tot,top,cnt,id;
- vector<int> dag[maxn];
- void addEdage(int u,int v)
- {
- next[tot]=head[u],to[tot]=v,head[u]=tot++;
- }
- void init()
- {
- memset(head,-1,sizeof(head));
- memset(vis,0,sizeof(vis));
- memset(dfn,0,sizeof(dfn));
- memset(ind,0,sizeof(ind));
- memset(color,0,sizeof(color));
- tot=top=cnt=id=0;
- }
- void tarjan(int v)
- {
- dfn[v]=low[v]=++cnt;
- vis[v]=1;
- stk[++top]=v;
- for(int i=head[v];i!=-1;i=next[i])
- {
- int u=to[i];
- if(!dfn[u])
- {
- tarjan(u);
- low[v]=min(low[v],low[u]);
- }
- else if(vis[u])
- low[v]=min(low[v],dfn[u]);
- }
- if(low[v]==dfn[v])
- {
- id++;
- while(true)
- {
- int u=stk[top--];
- vis[u]=0;
- scc[u]=id;
- if(u==v)break;
- }
- }
- }
- void buildDag(int n)
- {
- for(int u=0;u<2*n;u++)
- for(int i=head[u];i!=-1;i=next[i])
- {
- int v=to[i];
- if(scc[v]!=scc[u])
- {
- dag[scc[v]].push_back(scc[u]);
- ind[scc[u]]++;
- }
- }
- }
- void topsort()
- {
- queue<int> q;
- for(int i=1;i<=id;i++)
- if(!ind[i])q.push(i);
- while(!q.empty())
- {
- int u=q.front();
- q.pop();
- if(!color[u])
- color[u]=1,color[f[u]]=2;
- for(int i=0;i<(int)dag[u].size();i++)
- {
- int v=dag[u][i];
- ind[v]--;
- if(!ind[v])q.push(v);
- }
- }
- }
- void solve(int n)
- {
- for(int i=0;i<2*n;i++)
- if(!dfn[i])tarjan(i);
- for(int i=0;i<2*n;i+=2)
- if(scc[i]==scc[i+1])
- {
- printf("NIE\n");
- return;
- }
- else f[scc[i]]=scc[i+1],f[scc[i+1]]=scc[i];
- for(int i=0;i<=id;i++)
- dag[i].clear();
- buildDag(n);
- topsort();
- for(int i=0;i<2*n;i+=2)
- {
- if(color[scc[i]]==1)
- printf("%d\n",i+1);
- else
- printf("%d\n",i+2);
- }
- }
- int main()
- {
- // freopen("in.txt","r",stdin);
- int n,m;
- while(~scanf("%d%d",&n,&m))
- {
- init();
- for(int i=0,a,b;i<m;i++)
- {
- scanf("%d%d",&a,&b);
- a--,b--;
- addEdage(a,b^1);
- addEdage(b,a^1);
- }
- solve(n);
- }
- return 0;
- }
hdu 1814 2-sat 输出字典最小的和任意序列的 模板题的更多相关文章
- HDU 1814 Peaceful Commission
2-SAT,输出字典序最小的解,白书模板. //TwoSAT输出字典序最小的解的模板 //注意:0,1是一组,1,2是一组..... #include<cstdio> #include&l ...
- HDU 3264 区间内的最大最小之差
题目链接:http://poj.org/problem?id=3264 题目大意:在给定一堆牛的数量以及其高度的时候,每次给定一段区间,求这个区间内最高的牛和最矮的牛的高度之差为多少. 可以直接利用R ...
- HDU 2544 最短路 【Dijkstra模板题】
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2544 思路:最短路的模板题 Dijkstra 算法是一种类似于贪心的算法,步骤如下: 1.当到一个点时, ...
- Peaceful Commission HDU - 1814(输出最小的一组解)
Description 根据宪法,Byteland民主共和国的公众和平委员会应该在国会中通过立法程序来创立. 不幸的是,由于某些党派代表之间的不和睦而使得这件事存在障碍. 此委员会必须满足下列条件: ...
- HDU 1385 Minimum Transport Cost (输出字典序最小路径)【最短路】
<题目链接> 题目大意:给你一张图,有n个点,每个点都有需要缴的税,两个直接相连点之间的道路也有需要花费的费用.现在进行多次询问,给定起点和终点,输出给定起点和终点之间最少花费是多少,并且 ...
- hdu 1814 字典序最小的2sat(暴力深搜)
题意: 题意就是最基础的2sat,关系只有矛盾关系,然后二选一,关键是这个题目是输出字典序最小的那组解. 思路: 输出字典序最小,用强连通那个实现不了(起码没看到有人实现),其实我 ...
- HDU 1814 Peaceful Commission / HIT 1917 Peaceful Commission /CJOJ 1288 和平委员会(2-sat模板题)
HDU 1814 Peaceful Commission / HIT 1917 Peaceful Commission /CJOJ 1288 和平委员会(2-sat模板题) Description T ...
- 输入n个整数,输出其中最小的k个
描述 输入n个整数,输出其中最小的k个. 详细描述: 接口说明 原型: bool GetMinK(unsignedint uiInputNum, int * pInputArray, unsigned ...
- 排序,求几个最值问题,输入n个整数,输出其中最小的k个元素。
看完两个求最大值算法之后的一些感想. 如果想直接看算法的可以跳过.但是我觉得我这些想法还是比较有用的,至少对我将来的算法设计是这样的. 算法的功能越强大,必然意味着速度慢,因为根据丛林法则,那种慢又功 ...
随机推荐
- "HIBERNATE_SEQUENCE" does not exist问题处理
JavaWeb应用在MySQL环境下可以正常运行,数据迁移至Oracle或者人大金仓后应用运行爆出如下错误: 严重: Servlet.service() for servlet [JeeCmsAdmi ...
- 比较C#中几种常见的复制字节数组方法的效率[转]
[原文链接] 在日常编程过程中,我们可能经常需要Copy各种数组,一般来说有以下几种常见的方法:Array.Copy,IList<T>.Copy,BinaryReader.ReadByte ...
- CentOS安装GlassFish4.0 配置JDBC连接MySQL
转自:http://linux.it.net.cn/CentOS/course/2014/0724/3319.html 版本glassfish-4.0.zip 1.解压,拷贝到指定安装路径 unz ...
- 死磕 java魔法类之Unsafe解析
问题 (1)Unsafe是什么? (2)Unsafe只有CAS的功能吗? (3)Unsafe为什么是不安全的? (4)怎么使用Unsafe? 简介 本章是java并发包专题的第一章,但是第一篇写的却不 ...
- vim插件minibuf配置
1.去下载网站下载minibufexpl.vim文件放入到~/vim/plugins中,有的系统路径是~/.vim/plugins; 下载网址如下 https://www.vim.org/script ...
- 处理不同jQuery版本的兼容性问题
众所周知,jquery版本很多,而且有些版本的冲突也非常明显,有一些网上流传的很实用的插件是用A版本写的,但是要实现另各功能又必須用B版本.所以实现版本之間的和平相处很重要. 1.这里介绍一个函数,可 ...
- Laravel Mix编译前端资源
目前项目是使用的vue+laravel来写的,其中laravel和vue分别放了一个目录,但是这样有个问题,那就是vue需要经常更新,不然运行项目会经常出现各种问题,这里就看了看laravel的文档, ...
- oracle 表之间的连接
排序 - - 合并连接(Sort Merge Join, SMJ): a) 对于非等值连接,这种连接方式的效率是比较高的. b) 如果在关联的列上都有索引,效果更好. c) 对于将2个较大的row s ...
- 09CSS高级定位
CSS高级定位 定位方式——position position:static|absolute|relative static表示为静态定位,是默认设置. absolute表示绝对定位,与下位置属 ...
- python selenium定位总结(转)
转自:http://www.cnblogs.com/yufeihlf/p/5717291.html 父子定位元素 查找有父亲元素的标签名为span,它的所有标签名叫input的子元素 find_ele ...