看了大白书,学习了一下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. form-create教程:给内置组件和自定义组件添加事件

    本文将介绍form-create如何给内置组件和自定义组件添加事件 form-create 是一个可以通过 JSON 生成具有动态渲染.数据收集.验证和提交功能的表单生成器.并且支持生成任何 Vue ...

  2. FastDFS高可用集群架构配置搭建及使用

    一,概述FastDFS 是一个开源的高性能分布式文件系统(DFS). 它的主要功能包括:文件存储,文件同步和文件访问,以及高容量和负载平衡.FastDFS 系统有三个角色:跟踪服务器(Tracker ...

  3. Trie 树(字典树)

    [动画]看动画轻松理解「Trie树」 读音 Trie这个名字取自“retrieval”,检索,因为Trie可以只用一个前缀便可以在一部字典中找到想要的单词. 虽然发音与「Tree」一致,但为了将这种 ...

  4. linux centos Supervisor守护.netcore进程安装配置

    场景:当部署完.netcore程序后 使用dotnet xx.dll 后可以运行,但关闭shell或隔断时间会自动断开,此时部署的.netcore程序就不能访问了,此时需要用到Supervisor了 ...

  5. What Linux bind mounts are really doing

    Lots of Unixes have some form of 'loopback' mounts, where you can mount a bit of an existing filesys ...

  6. 用js刷剑指offer(斐波那契数列)

    牛客网链接 下面介绍一下什么是斐波那契数列 js代码 知道了通项公式,那代码就非常简单了 function Fibonacci(n) { // write code here let pre = 1 ...

  7. mysql打开报错2013解决办法

    修改mysql配置文件 在[mysqld]下面设置skip-name-resolve 重启mysql from :https://www.jb51.net/article/52637.htm

  8. Vant UI 组件库如何做rem适配?

    Vant是一款移动端基于vue的组件库,V2.1.1版本非常棒.文档地址:https://youzan.github.io/vant/?source=vuejsorg#/zh-CN/intro,那么V ...

  9. Java基础-异常处理机制 及异常处理的五个关键字:try/catch/finally/throw /throws

    笔记: /** 异常处理机制: 抓抛模型 * 1."抛", 一旦抛出,程序终止! printStackTrace()显示异常路径! * 2."抓", 抓住异常 ...

  10. Lucene简单了解和使用

    一,Lucene简介 1 . Lucene  是什么? Lucene 是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎, ...