BZOJ-3495 前缀优化建图2-SAT
题意:有n个城镇被分成了k个郡,有m条连接城镇的无向边。要求给每个郡选择一个城镇作为首都,满足每条边至少有一个端点是首都。
解法:以前没学过,参考https://blog.csdn.net/linkfqy/article/details/76242377的解法,涨姿势了。首先普通的建图,对于一个国家只能有一个首都,朴素的想法是如果选一个点为首都那么这个国家其他点都不能选,这样建图是n^2的显然会爆空间加超时。这里用到一种加前缀优化建图的技巧,主要是我们观察朴素建图有很多重复的浪费边,像在这个首都里选i点那么会从i连向(1,2...i-1,i+1,...n)的不选边,如果选i+1点就会向(1,2...i,i+2...n)连不选边,其实这两堆边除了i和i+1有些许不同,连向其他的边都是一样的,十分浪费。于是我们像用前缀来表示从而优化建图。
用u表示选i点,u'表示不选i点,U表示选u点前缀的某一个,U'表示不选u的前缀。那么仔细思考连边:

然后做2-SAT就行了。
细节详见代码:
#include<bits/stdc++.h>
using namespace std;
const int N=4e6+;
int n,m,k,dfs_clock=,scc_cnt=;
int pre[N],dfn[N],low[N],c[N]; int cnt=,head[N<<],nxt[N<<],to[N<<];
void add_edge(int x,int y) {
nxt[++cnt]=head[x]; to[cnt]=y; head[x]=cnt;
} int top=,S[N],ins[N];
void tarjan(int x) {
low[x]=dfn[x]=++dfs_clock;
ins[x]=; S[++top]=x;
for (int i=head[x];i;i=nxt[i]) {
int y=to[i];
if (!dfn[y]) {
tarjan(y);
low[x]=min(low[x],low[y]);
} else if (ins[y]) low[x]=min(low[x],dfn[y]);
}
if (dfn[x]==low[x]) {
int y; ++scc_cnt;
do {
y=S[top--]; ins[y]=;
c[y]=scc_cnt;
} while (x!=y);
}
} int main()
{
cin>>n>>m>>k;
//u->4x:点x首都,u'->4x+1:点x不首都,U->4x+2:前缀x首都,U'->4x+3:前缀x不首都
for (int i=;i<=m;i++) {
int x,y; scanf("%d%d",&x,&y);
add_edge(*y+,*x); add_edge(*x+,*y); //一条边两个点必有一个首都
}
for (int i=;i<=k;i++) {
int t,x,lst=; scanf("%d",&t);
for (int j=;j<=t;j++) {
scanf("%d",&x);
pre[x]=lst; lst=x;
}
}
for (int i=;i<=n;i++) { //前缀优化建图
add_edge(*i,*i+); //u->U
add_edge(*i+,*i+); //U'->u'
if (pre[i]) {
add_edge(*pre[i]+,*i+); //Upre[x]->U
add_edge(*i+,*pre[i]+); //U'->U'pre[x]
add_edge(*i,*pre[i]+); //u->U'pre[x]
add_edge(*pre[i]+,*i+); //Upre[x]->u'
}
} for (int i=*;i<=n*+;i++)
if (!dfn[i]) tarjan(i);
for (int i=*;i<=n*+;i++)
if (c[i]==c[i^]) return puts("NIE"),;
puts("TAK");
return ;
}
BZOJ-3495 前缀优化建图2-SAT的更多相关文章
- 2-SET 前缀优化建图
1, Duff in Mafia CodeForces - 587D 2, Ants CodeForces - 1007D
- BZOJ 4276 [ONTAK2015]Bajtman i Okrągły Robin 费用流+线段树优化建图
Description 有n个强盗,其中第i个强盗会在[a[i],a[i]+1],[a[i]+1,a[i]+2],...,[b[i]-1,b[i]]这么多段长度为1时间中选出一个时间进行抢劫,并计划抢 ...
- BZOJ 3073: [Pa2011]Journeys Dijkstra+线段树优化建图
复习一下线段树优化建图:1.两颗线段树的叶子节点的编号是公用的. 2.每次连边是要建两个虚拟节点 $p1,p2$ 并在 $p1,p2$ 之间连边. #include <bits/stdc++.h ...
- BZOJ 4289 最短路+优化建图
题意:给出一个N个点M条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点1到点N的最小代价.起点的代价是离开起点的边的边权,终点的代价是进入终点的边的边权. 解法:参考h ...
- bzoj3073: [Pa2011]Journeys 线段树优化建图
bzoj3073: [Pa2011]Journeys 链接 BZOJ 思路 区间和区间连边.如何线段树优化建图. 和单点连区间类似的,我们新建一个点,区间->新点->区间. 又转化成了单点 ...
- 【BZOJ4383】[POI2015]Pustynia 线段树优化建图
[BZOJ4383][POI2015]Pustynia Description 给定一个长度为n的正整数序列a,每个数都在1到10^9范围内,告诉你其中s个数,并给出m条信息,每条信息包含三个数l,r ...
- AtCoder Regular Contest 069 F Flags 二分,2-sat,线段树优化建图
AtCoder Regular Contest 069 F Flags 二分,2-sat,线段树优化建图 链接 AtCoder 大意 在数轴上放上n个点,点i可能的位置有\(x_i\)或者\(y_i\ ...
- loj#2255. 「SNOI2017」炸弹 线段树优化建图,拓扑,缩点
loj#2255. 「SNOI2017」炸弹 线段树优化建图,拓扑,缩点 链接 loj 思路 用交错关系建出图来,发现可以直接缩点,拓扑统计. 完了吗,不,瓶颈在于边数太多了,线段树优化建图. 细节 ...
- bzoj4383 [POI2015]Pustynia 拓扑排序+差分约束+线段树优化建图
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4383 题解 暴力的做法显然是把所有的条件拆分以后暴力建一条有向边表示小于关系. 因为不存在零环 ...
随机推荐
- 用java 调用oracle存储过程总结
SSM-Mybatis调用Oracle存储过程返回结果集(游标)示例 https://www.jianshu.com/p/0ae6d9d66d61 用java调用oracle存储过程总结 //1.ca ...
- 2018-2-13-win10-uwp-绑定密码
title author date CreateTime categories win10 uwp 绑定密码 lindexi 2018-2-13 17:23:3 +0800 2018-2-13 17: ...
- linux 系统管理--进程管理
目录 linux 系统管理--进程管理 一.进程基本概述 二.监控进程状态 三.进程的优先级[进阶] 四.企业案例,Linux假死是怎么回事 五.后台进程管理 六.系统平均负载[进阶] linux 系 ...
- 何时使用move
https://zhidao.baidu.com/question/1514190267640555740.html 但编译器有copy elision优化,相当于原地构造,效率要高于move,手动指 ...
- 获得本机物理ip地址mac
https://blog.csdn.net/guang670248515/article/details/81040797 文章来源:https://blog.csdn.net/kingepoch/a ...
- servlet 实践
基础 当Servlet引擎收到一个请求,它将请求所有的细节汇编到一个HttpServletRequest对象.细节包括请求头部.URI.查询字符串和任意发送的参数等等.类似地,它初始化一个处理响应头部 ...
- spring 获取url参数
1. usl格式: http://localhost:8080/contact/delete/3 java代码 @RequestMapping(value="/delete/{id}&quo ...
- UVA 10529 - Dumb Bones (概率dp)
题目描述 You are trying to set up a straight line of dominos, standing on end, to be pushed over later f ...
- 2019牛客多校第五场 B - generator 1 矩阵快速幂+十倍增+二进制倍增优化
B - generator 1 题意 给你\(x_{0}.x_{1}.a.b.b.mod\),根据\(x_{i} = a*x_{i-1} + b*x_{i-2}\)求出\(x_{n}\) 思路 一般看 ...
- AcWing 220.最大公约数 欧拉函数打卡
题目:https://www.acwing.com/problem/content/222/ 题意:求1-n范围内,gcd(x,y)是素数的对数 思路:首先我们可以针对每个素数p,那么他的贡献应该时 ...