看了大白书,学习了一下two-sat,很有意思的算法。题目就是大白书上的两题。

  仅仅放一下代码作为以后的模板参考。

 #include <stdio.h>
#include <algorithm>
#include <string.h>
#include <vector>
using namespace std;
const int N = + ; struct TwoSAT
{
int n;
vector<int> G[N*];
bool mark[N*];
int S[N*], c; bool dfs(int x)
{
if(mark[x^]) return ;
if(mark[x]) return ;
mark[x] = ;
S[c++] = x;
for(int i=;i<G[x].size();i++)
{
int v = G[x][i];
if(!dfs(v)) return false;
}
return true;
} void init(int n)
{
this->n = n;
for(int i=;i<*n;i++) G[i].clear();
memset(mark,false,sizeof(mark));
} void addEdge(int x,int xval,int y,int yval)
{
x = x * + xval;
y = y * + yval;
G[x^].push_back(y);
G[y^].push_back(x);
} bool solve()
{
for(int i=;i<*n;i+=)
{
if(!mark[i] && !mark[i+])
{
c = ;
if(!dfs(i))
{
while(c > ) mark[S[--c]] = ;
if(!dfs(i + )) return false;
}
}
}
return true;
}
}solver; int n;
int T[N][];
bool can(int dif)
{
solver.init(n);
for(int i=;i<n;i++) for(int j=i+;j<n;j++)
for(int a=;a<;a++) for(int b=;b<;b++)
{
if(std::abs(T[i][a] - T[j][b]) < dif) solver.addEdge(i,a^,j,b^);
}
return solver.solve();
} int main()
{
while(scanf("%d",&n) == )
{
int L = , R = ;
for(int i=;i<n;i++) for(int j=;j<;j++) {scanf("%d",&T[i][j]); R = max(R, T[i][j]);}
int ans = -;
while(L <= R)
{
int mid = L + R >> ;
if(can(mid)) {ans = mid; L = mid + ;}
else R = mid - ;
}
printf("%d\n",ans);
}
return ;
}

UVALive - 3211

 #include <stdio.h>
#include <algorithm>
#include <string.h>
#include <vector>
using namespace std;
const int N = 1e5 + ; struct TwoSAT
{
int n;
vector<int> G[N*];
bool mark[N*];
int S[N*], c; bool dfs(int x)
{
if(mark[x^]) return ;
if(mark[x]) return ;
mark[x] = ;
S[c++] = x;
for(int i=;i<G[x].size();i++)
{
int v = G[x][i];
if(!dfs(v)) return false;
}
return true;
} void init(int n)
{
this->n = n;
for(int i=;i<*n;i++) G[i].clear();
memset(mark,false,sizeof(mark));
} void addEdge(int x,int xval,int y,int yval)
{
x = x * + xval;
y = y * + yval;
G[x^].push_back(y);
G[y^].push_back(x);
} bool solve()
{
for(int i=;i<*n;i+=)
{
if(!mark[i] && !mark[i+])
{
c = ;
if(!dfs(i))
{
while(c > ) mark[S[--c]] = ;
if(!dfs(i + )) return false;
}
}
}
return true;
}
}solver; int n,m;
int p[N];
char get(bool mark,bool flag)
{
if(flag) return mark ? 'A' : 'C';
else return mark ? 'B' : 'C';
} int main()
{
while(scanf("%d%d",&n,&m) == )
{
if(n == && m == ) break;
solver.init(n);
int sum = ;
for(int i=;i<n;i++) scanf("%d",p+i), sum += p[i]; for(int i=;i<m;i++)
{
int a,b;
scanf("%d%d",&a,&b);
a--, b--;
if(n * p[a] >= sum && n * p[b] >= sum || n * p[a] < sum && n * p[b] < sum)
{
solver.addEdge(a,,b,);
solver.addEdge(a,,b,);
}
else solver.addEdge(a,,b,);
}
if(solver.solve() == false) puts("No solution.");
else
{
for(int i=;i<*n;i+=)
{
if(solver.mark[i]) puts("C");
else if(n * p[i / ] >= sum) puts("A");
else puts("B");
}
}
}
return ;
}

UVALive - 3713

2-SAT两题的更多相关文章

  1. MT【249】离心率两题

    椭圆$\dfrac{x^2}{a^2}+\dfrac{y^2}{b^2}=1,(a>b>0)$的一个焦点为$F$,过$F$的直线交椭圆于$A,B$两点,$M$是点$A$关于原点的对称点.若 ...

  2. 最近切的两题SCC的tarjan POJ1236 POJ2186

    两题都是水题,1236第一问求缩点后入度为0的点数,第二问即至少添加多少条边使全图强连通,属于经典做法,具体可以看白书 POJ2186即求缩点后出度为0的那个唯一的点所包含的点数(即SCC里有多少点) ...

  3. 清橙A1206.小Z的袜子 && CF 86D(莫队两题)

    清橙A1206.小Z的袜子 && CF 86D(莫队两题) 在网上看了一些别人写的关于莫队算法的介绍,我认为,莫队与其说是一种算法,不如说是一种思想,他通过先分块再排序来优化离线查询问 ...

  4. 类似区间计数的种类并查集两题--HDU 3038 & POJ 1733

    1.POJ 1733 Parity game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5744   Accepted: ...

  5. Codeforces Round #197 (Div. 2) C,D两题

    开了个小号做,C题一开始看错范围,D题看了半小时才看懂,居然也升到了div1,囧. C - Xenia and Weights 给出一串字符串,第i位如果是1的话,表示有重量为i的砝码,如果有该种砝码 ...

  6. Educational Codeforces Round 58 (Rated for Div. 2) (前两题题解)

    感慨 这次比较昏迷最近算法有点飘,都在玩pygame...做出第一题让人hack了,第二题还昏迷想错了 A Minimum Integer(数学) 水题,上来就能做出来但是让人hack成了tle,所以 ...

  7. noip2016 小结(ac两题+学习总结)

    NOIP2016考试小结 DAY 1 T1 题目描述 小南有一套可爱的玩具小人, 它们各有不同的职业. 有一天, 这些玩具小人把小南的眼镜藏了起来. 小南发现玩具小人们围成了一个圈,它们有的面朝圈内, ...

  8. <每日一题> Day5:简单递推两题

    原题链接 参考代码: #include <iostream> using namespace std; typedef long long ll; + ; ll dp[maxn]; int ...

  9. 【leetcode每日两题】-Day1-简单题

    1. 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,数组中同一个元素 ...

随机推荐

  1. Asp.Net Core 2.0 之旅---@Html.Action

    原文:Asp.Net Core 2.0 之旅---@Html.Action 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https: ...

  2. Ctrl+R快速启动应用程序

    1.打开注册表 Ctrl+R搜索框中键入“regedit”,回车打开注册表 2.找到HKEY_LOCAL_MACHINE中的如下路径 HKEY_LOCAL_MACHINE\SOFTWARE\Micro ...

  3. DotNet跨平台 - docker部署.net core2.0项目

    参考文档: https://docs.docker.com/install/linux/docker-ce/centos/ http://www.dockerinfo.net/document htt ...

  4. 基因组所三代单分子测序PacBio完成技术升级—超长读长助力基因组学研究

    基因组所三代单分子测序PacBio完成技术升级—超长读长助力基因组学研究 2015-09-23 | 作者:所级中心基因组平台 张兵 [关闭] 近日,基因组所所级中心基因组平台三代单分子实时测序PacB ...

  5. 每次开机都要按F1的解决办法

    买了个新的硬盘来装电脑,装操作系统时到微软官网下载了WIN10放在U盘里制作成系统安装盘,具体操作自己百度.装好了之后发现每次开机都要按一下F1,百度了很多都没用, 一次偶然的机会,我拆开了电脑主机硬 ...

  6. requests Use body.encode('utf-8') if you want to send it encoded in UTF-8

    基本环境 使用 requests 模块发送 post 请求,请求体包含中文报错 系统环境:centos7.3 python版本:python3.6.8 请求代码: // 得到中文 param_json ...

  7. Spring AOP编程经验总结

    编程范式概览:面向过程,面向对象,函数式编程,事件驱动编程,面向切面等, AOP是什么? Spring AOP是采用面向切面编程的编程范式,而非编程语言,它只能解决特定问题,而非所有问题,它与OOP不 ...

  8. 纪念一下,时隔多年,继delphi上成功运行sql之后

    纪念一下,时隔多年,继delphi上成功运行sql之后,在linux上用eclipse成功运行Wordcount程序,不容易呀,折腾了十几天 但我知道,这仅仅是我学习大数据的一个开始,仅此纪念一下,不 ...

  9. 05 Windows编程——Windows程序框架

    源码 #include<Windows.h> LRESULT CALLBACK WindProc(HWND hwnd, UINT message, WPARAM wParam, LPARA ...

  10. python使得文件不包含重复行

    set函数去重 # -*- coding:utf-8 -*- srcTxt=open('1.txt','r').readlines() noRepeat=open('2.txt','w') st=se ...