之前做的两发

https://vjudge.net/problem/UVALive-3211

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn = ;
int t[maxn][], n, tot, S[maxn*], scnt;
bool mark[maxn*];
struct Edge{
int v, nxt;
Edge(){}
Edge(int v, int nxt):v(v), nxt(nxt){}
}edge[maxn*maxn*];
int head[maxn*];
void addedge(int u, int v){
edge[tot] = Edge(v, head[u]);
head[u] = tot++;
}
void conj(int x, int detx, int y, int dety){
x = *x+detx;
y = *y+dety;
addedge(x^, y);
addedge(y^, x);
}
void build(int mid){
tot = ;
memset(head, -, sizeof head);
for(int i = ; i < n; i++)
for(int a = ; a < ; a++)
for(int j = i+; j < n; j++)
for(int b = ; b < ; b++)
if(fabs(t[i][a]-t[j][b]) < mid)
conj(i, a^, j, b^); }
bool dfs(int x){
if(mark[x])
return true;
if(mark[x^])
return false;
mark[x] = true;
S[scnt++] = x;
for(int i = head[x]; ~i; i = edge[i].nxt){
int v = edge[i].v;
if(!dfs(v))
return false;
}
return true;
}
bool solve(){
memset(mark, false, sizeof mark);
for(int i = ; i < *n; i+=){
if(!mark[i]&&!mark[i+]){
scnt = ;
if(!dfs(i)){
for(int j = ; j < scnt; j++){
mark[S[j]] = false;
}
scnt = ;
if(!dfs(i+))
return false;
}
}
}
return true;
}
int main(){
while(scanf("%d", &n)== && n){
for(int i = ; i < n; i++)
for(int j = ; j < ; j++){
scanf("%d", &t[i][j]);
}
int l = , r = 1e7;
while(l < r){
int mid = (r-l+)/+l;
build(mid);
if(solve())
l = mid;
else
r = mid-;
}
printf("%d\n", l);
}
return ;
}
/*
10
44 156
153 182
48 109
160 201
55 186
54 207
55 165
17 58
132 160
87 197
*/

https://vjudge.net/problem/UVALive-3713

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn = ;
int age[maxn], n, m, tot, S[maxn*], scnt;
double ave;
bool mark[maxn*];
struct Edge{
int v, nxt;
Edge(){}
Edge(int v, int nxt):v(v), nxt(nxt){}
}edge[*];
int head[maxn*];
void addedge(int u, int v){
edge[tot] = Edge(v, head[u]);
head[u] = tot++;
}
void conj(int x, int detx, int y, int dety){
x = *x+detx;
y = *y+dety;
addedge(x^, y);
addedge(y^, x);
}
bool dfs(int x){
if(mark[x])
return true;
if(mark[x^])
return false;
mark[x] = true;
S[scnt++] = x;
for(int i = head[x]; ~i; i = edge[i].nxt){
int v = edge[i].v;
if(!dfs(v))
return false;
}
return true;
}
bool solve(){
memset(mark, false, sizeof mark);
for(int i = ; i < *n; i+=){
if(!mark[i]&&!mark[i+]){
scnt = ;
if(!dfs(i)){
for(int j = ; j < scnt; j++){
mark[S[j]] = false;
}
scnt = ;
if(!dfs(i+))
return false;
}
}
}
return true;
}
int main(){
while(scanf("%d%d", &n, &m)){
tot = ;
memset(head, -, sizeof head);
if(!n&&!m)
break;
double sum = ;
for(int i = ; i < n; i++){
scanf("%d", &age[i]);
sum += age[i];
}
ave = sum/n;
while(m--){
int u, v;
scanf("%d%d", &u, &v);
u--;
v--;
if((age[u]<ave&&age[v]<ave) || (age[u]>=ave&&age[v]>=ave)){
conj(u, , v, );
conj(u, , v, );
}
else{
conj(u, , v, );
}
}
if(!solve()){
puts("No solution.");
}
else{
for(int i = ; i < *n; i+=){
if(mark[i]){
printf("C\n");
}
else{
if(age[i/]>=ave)
printf("A\n");
else
printf("B\n");
}
}
}
}
return ;
}
/*
16 20 21
22
23
24
25
26
27
28 101 102 103 104 105 106 107 108
1 2 3 4 5 6 7 8
9 10 11 12 13 14 15 16 1 10 2 9
3 12 4 11 5 14 6 13 7 16 8 15 1 12 1 13 3 16 6 15 0 0*/

由于拆点,点数应该是2n...

每个字句a|b 加边!a -> b, !b -> a, 两条边呢...

点和边开的不够大,一言不合就爆掉了...

2sat的更多相关文章

  1. 2-Sat问题

    二分+2-Sat 判断是否可行 输出字典序最小的解 输出字典序可行解 其实这些都是小问题,最重要的是建图,请看论文. 特殊的建边方式,如果a b是一对,a必须选,那么就是b->a建边. HDU ...

  2. UVALive 4849 String Phone(2-sat、01染色)

    题目一眼看去以为是4-sat... 题意:给n(n<=3000)个黑方块的坐标,保证黑方块没有公共边.对于每个黑方块选一个角作为结点,使得所选结点满足输入的一个无向图.其中距离为曼哈顿距离.输出 ...

  3. POJ 3683 Priest John's Busiest Day (2-SAT)

    题意:有n对新人要在同一天结婚.结婚时间为Ti到Di,这里有时长为Si的一个仪式需要神父出席.神父可以在Ti-(Ti+Si)这段时间出席也可以在(Di-Si)-Si这段时间.问神父能否出席所有仪式,如 ...

  4. UVa 1391 Astronauts (2SAT)

    题意:给出一些宇航员他们的年龄,x是他们的平均年龄,其中A任务只能给年龄大于等于x的人,B任务只能给小于x的人,C任务没有限制.再给出m对人,他们不能同任务.现在要你输出一组符合要求的任务安排. 思路 ...

  5. hdu 3622 Bomb Game(二分+2-SAT)

    Bomb Game Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  6. zoj 3717 - Balloon(2-SAT)

    裸的2-SAT,详见刘汝佳训练指南P-323 不过此题有个特别需要注意的地方:You should promise that there is still no overlap for any two ...

  7. [BZOJ 1997][HNOI2010]Planar(2-SAT)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1997 分析: 考虑每条边是在圈子里面还是圈子外面 所以就变成了2-SAT判定问题了= ...

  8. 【POJ 3062】Party(2-SAT、tarjan)

    2-SAT的入门题. a,a',b,b'分别表示两对夫妇,如果a,b有矛盾,那么a要来,就只能来b',b要来,就只能来a'.于是建了两条边(a,b'),(b,a'). 用tarjan强连通分量缩点染色 ...

  9. [模板] 2-SAT

    昨天早上在准备省队集训,发现自己连2-SAT是什么都不知道,于是一早上都投身于2-SAT模板中,终于有个结果. 思路如下: 1.根据条件表达式建边: 2.缩环: 3.判断是否可行: 4.根据缩完环的图 ...

  10. 2-SAT 问题

    2-SAT 问题是k-SAT问题在k==2时的特殊情况,因为已经证明k>=3时的k-sat问题属于npc问题.所以在这里仅研究2-SAT的特殊情况.   何为2-sat问题? 简单地说就是有N个 ...

随机推荐

  1. javascript任务队列

    摘自:https://www.cnblogs.com/liangyin/p/9783342.html,谢谢作者分享! 任务队列 所有任务可以分成两种,一种是 同步任务(synchronous),另一种 ...

  2. MapReduce词频统计

    自定义Mapper实现 import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; impor ...

  3. Docker动态给容器Container暴露端口

    查看Container的IP地址 docker inspect <container name or id>| grep IPAddress 查看Container的映射的端口 docke ...

  4. windows 安装memchched和memcache教程

    Memcached是一个内存缓存系统,而Memcache是php的一个扩展,是php用于操作和管理Memcached的工具.如果安装了Memcached但没有安装Memcache,php无法操控Mem ...

  5. IntelliJ IDEA 创建 Java包

    一.创建包 1.在已有项目的"src"文件夹 -> 右键 -> New -> Package 2.命名包名,注意命名规范 二.创建类 1.新建包成功之后,在包上右 ...

  6. 【转载】如何直观的理解 O(logn) 时间复杂度的神奇之处

    转自 https://blog.csdn.net/u012814856/article/details/83010082 一.引言最近在极客时间上订阅了<数据结构与算法>的课程,其中王争老 ...

  7. 大数据学习之hdfs集群安装部署04

    1-> 集群的准备工作 1)关闭防火墙(进行远程连接) systemctl stop firewalld systemctl -disable firewalld 2)永久修改设置主机名 vi ...

  8. RESTful-5开发API

    RESTful 是目前最流行的 API 设计规范,用于 Web 数据接口的设计. 它的大原则容易把握,但是细节不容易做对.本文总结 RESTful 的设计细节,介绍如何设计出易于理解和使用的 API. ...

  9. 使用Kazoo操作ZooKeeper服务治理

    单机服务的可靠性及可扩展性有限,某台服务宕机可能会影响整个系统的正常使用:分布式服务能够有效地解决这一问题,但同时分布式服务也会带来一些新的问题,如:服务发现(新增或者删除了服务如何确保能让客户端知道 ...

  10. IntelliJ IDE 基础经验备案

    1.配置本地的JAVA环境 2.配置本地安装的Maven环境 详情 1.配置本地的JAVA环境 准备: 本地已经安装java环境,目录:C:\Program Files\Java\jdk1.8.0_1 ...