看了大白书,学习了一下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视图组件

    视图组件 asp.net core mvc 提供了部分视图的新替代品:视图组件. 视图组件与分布视图的主要区别在于视图组件与控制器不相关.可使用在独立于单个控制器的场景,如:菜单导航.侧边栏.分页栏等 ...

  2. 客户端相关知识学习(十二)之iOS H5交互Webview实现localStorage数据存储

    前言 最近有一个需求是和在app中前端本地存储相关的,所以恶补了一下相关知识 webView开启支持H5 LocalStorage存储 有些时候我们发现写的本地存储没有起作用,那是因为默认WebVie ...

  3. Java Web-JSTL

    Java Web-JSTL 概念 Java Server Pages Tag Library:JSP标准标签库 是由Apache组织提供的开源.免费JSP标签 用于简化和替换JSP页面上的Java代码 ...

  4. modelsim仿真xilinx ram输出均为0

    现象 在vivado2018.3下生成了RAM IP,丢到modelsim中仿真发现doutb输出均为0.调整AB端口的时钟速率,发现低于5ns不行,输出为0.但5ns以上正常. 解决方法 比对了vi ...

  5. Go微服务 grpc的简单使用

    作者:薇文文链接:https://www.jianshu.com/p/20ed82218163来源:简书 准备工作 先安装Protobuf 编译器 protoc,下载地址:https://github ...

  6. Eclipse安装windowsbuilder

    详见:https://www.cnblogs.com/plusplus/p/9864708.html https://www.cnblogs.com/lsy-blogs/p/7717036.html ...

  7. Linux命令——diff、patch

    简介 diff以行为单位比较不同ASCII文件差异,可以输出一组指令,用于指导如何更改一个文件使其与第二个文件相同.diff在软件开发时多用于比较新旧版本代码,和patch连用可以将文件间区别做成补丁 ...

  8. java8大基本类型

    文章转载自:Java的8种基本数据类型 请阅读原文. 关于Java的8种基本数据类型,其名称.位数.默认值.取值范围及示例如下表所示: 序号 数据类型 位数 默认值 取值范围 举例说明 1 byte( ...

  9. Maven打包Web项目成war包——4

    1. 需要安装maven 的war插件支持 在pom.xml里面配置war插件       2. 运行命令: mvn clean package      3.部署到Tomcat下面发布,并访问!

  10. MySQL进阶 9: 联合查询 - 查询语句1 union 查询语句2 union ...

    #进阶 : 联合查询 /* union 联合 合并: 将多条查询语句的结果合并成一个结果 语法: 查询语句1 union 查询语句2 union ... 应用语境: 要查询的结果来自多个表,但查询的列 ...