#2-SAT,Tarjan,前缀优化建边#洛谷 6378 [PA2010]Riddle
题目
\(n\) 个点 \(m\) 条边的无向图被分成 \(k\) 个部分。每个部分包含一些点。
请选择一些关键点,使得每个部分恰有一个关键点,且每条边至少有一个端点是关键点。
分析
每条边至少有一个端点是关键点很好做就是\(x'->y,y'->x\),
考虑每个部分恰有一个怎么做,不可能暴力建边,
考虑把前\(i\)个是否选新开节点,那么就得满足
\(pre_{a_{i-1}}->a_{i}'\qquad a_i->pre_{a_{i-1}}'\)(选择\(1\sim i-1\)就不能选\(i\),反之亦然)
\(a_i->pre_{a_i}\qquad pre_{a_i}'->a_i'\)(选择\(i\)就一定选择\(1\sim i\),反之亦然)
\(pre_{a_i}'->pre_{a_{i-1}}'\qquad pre_{a_{i-1}}->pre_{a_i}\)(选择\(1\sim i-1\)就一定选择\(1\sim i\),反之亦然)
这样就能强制保证每个部分有且仅有一个,套2-SAT模板就行了
代码
#include <cstdio>
#include <cctype>
#include <stack>
#define rr register
using namespace std;
const int N=4000011; struct node{int y,next;}e[N<<1];
int dfn[N],low[N],v[N],as[N],col[N],tot,cnt,et,n,m,k; stack<int>stac;
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline signed min(int a,int b){return a<b?a:b;}
inline void add(int x,int y){e[++et]=(node){y,as[x]},as[x]=et;}
inline signed fal(int x){return x+n;};
inline signed tru(int x){return x;}
inline signed sub(int x){return x+n*2;}
inline void tarjan(int x){
dfn[x]=low[x]=++tot,v[x]=1,stac.push(x);
for (rr int i=as[x];i;i=e[i].next)
if (!dfn[e[i].y]){
tarjan(e[i].y);
low[x]=min(low[x],low[e[i].y]);
}else if (v[e[i].y])
low[x]=min(low[x],dfn[e[i].y]);
if (dfn[x]==low[x]){
rr int y; ++cnt;
do{
y=stac.top(),stac.pop();
v[y]=0,col[y]=cnt;
}while (x^y);
}
}
signed main(){
n=iut(); m=iut(); k=iut();
for (rr int i=1;i<=m;++i){
rr int x=iut(),y=iut();
add(fal(x),tru(y)),add(fal(y),tru(x));
}
for (rr int i=1,t;i<=k;++i){
t=iut();
for (rr int j=1;j<=t;++j){
rr int x=iut();
add(tru(x),tru(sub(j+tot))),
add(fal(sub(j+tot)),fal(x));
if (j>1){
add(tru(sub(j-1+tot)),tru(sub(j+tot))),
add(fal(sub(j+tot)),fal(sub(j-1+tot))),
add(tru(x),fal(sub(j-1+tot))),
add(tru(sub(j-1+tot)),fal(x));
}
}
tot+=t;
}
tot=0;
for (rr int i=1;i<=n*4;++i) if (!dfn[i]) tarjan(i);
for (rr int i=1;i<=n;++i)
if (col[tru(i)]==col[fal(i)])
return !printf("NIE");
for (rr int i=1;i<=n;++i)
if (col[tru(sub(i))]==col[fal(sub(i))])
return !printf("NIE");
return !printf("TAK");
}
#2-SAT,Tarjan,前缀优化建边#洛谷 6378 [PA2010]Riddle的更多相关文章
- CF1007D. Ants(树链剖分+线段树+2-SAT及前缀优化建图)
题目链接 https://codeforces.com/problemset/problem/1007/D 题解 其实这道题本身还是挺简单的,这里只是记录一下 2-SAT 的前缀优化建图的相关内容. ...
- [SDOI2017]天才黑客[最短路、前缀优化建图]
题意 一个 \(n\) 点 \(m\) 边的有向图,还有一棵 \(k\) 个节点的 trie ,每条边上有一个字符串,可以用 trie 的根到某个节点的路径来表示.每经过一条边,当前携带的字符串就会变 ...
- BZOJ.3495.[PA2010]Riddle(2-SAT 前缀优化建图)
题目链接 每个城市要么建首都要么不建,考虑2-SAT 这样一个国家内城市两两连边是很显然的,但是边数为O(n^2) 每个国家中仅有一个建首都,考虑新建前缀S[i]=1/0这2n个点表示当前国家的[1, ...
- 【CF587D】Duff in Mafia 二分+前缀优化建图+2-SAT
[CF587D]Duff in Mafia 题意:给你一张n个点m条边的无向图,边有颜色和边权.你要从中删去一些边,满足: 1.任意两条删掉的边没有公共的顶点.2.任意两条剩余的.颜色相同的边没有公共 ...
- Tarjan缩点+LCA【洛谷P2416】 泡芙
P2416 泡芙 题目描述 火星猫经过一番努力终于到达了冥王星.他发现冥王星有 N 座城市,M 条无向边.火星猫准备出发去找冥王兔,他听说有若干泡芙掉落在一些边上,他准备采集一些去送给冥王兔.但是火星 ...
- 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP
题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...
- 洛谷 P2046 BZOJ 2007 海拔(NOI2010)
题目描述 YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域.简单起见,可以将YT市看作 一个正方形,每一个区域也可看作一个正方形.从而,YT城市中包括(n+1)×(n+1)个 ...
- 洛谷P3957 跳房子(Noip2017普及组 T4)
今天我们的考试就考到了这道题,在考场上就压根没有思路,我知道它是一道dp的题,但因为太弱还是写不出来. 下来评讲的时候知道了一些思路,是dp加上二分查找的方式,还能够用单调队列优化. 但看了网上的许多 ...
- 洛谷P1880 [NOI1995]石子合并 纪中21日c组T4 2119. 【2016-12-30普及组模拟】环状石子归并
洛谷P1880 石子合并 纪中2119. 环状石子归并 洛谷传送门 题目描述1 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石 ...
- BZOJ5017 [SNOI2017]炸弹 - 线段树优化建图+Tarjan
Solution 一个点向一个区间内的所有点连边, 可以用线段树优化建图来优化 : 前置技能传送门 然后就得到一个有向图, 一个联通块内的炸弹可以互相引爆, 所以进行缩点变成$DAG$ 然后拓扑排序. ...
随机推荐
- 项目实战:Qt+OpenCV图像处理与识别算法平台
若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...
- SUB-LVDS 与LVDS 互联
SUB-LVDS 与 LVDS介绍 电气规范 今天有同学问SUB-LVDS输出是否能接到LVDS输入上,以前没用过SUB-LVDS,一起学习一下. Sub-LVDS is a differential ...
- 我的第一个项目(十五) :完成数据保存功能(后端,改update)
好家伙, 代码已开源(Gitee) PH-planewar: 个人开发的全栈小游戏 前端:vue2 + element-ui 后端: Springboot + mybatis-plus 数据库: ...
- 机器学习策略篇:详解满足和优化指标(Satisficing and optimizing metrics)
满足和优化指标 要把顾及到的所有事情组合成单实数评估指标有时并不容易,在那些情况里,发现有时候设立满足和优化指标是很重要的,让我告诉是什么意思吧. 假设已经决定很看重猫分类器的分类准确度,这可以是\( ...
- 【Azure 应用服务】NodeJS项目部署在App Service For Linux环境中,部署完成后应用无法访问
问题描述 NodeJS项目部署在App Service For Linux环境中,部署完成后应用无法访问,在启动日志中发现错误消息:ERROR - Container XXX_0 for site X ...
- 【Azure Spring Cloud】使用azure-spring-boot-starter-storage来上传文件报错: java.net.UnknownHostException: xxxxxxxx.blob.core.windows.net: Name or service not known
问题描述 使用 azure-spring-boot-starter-storage 来上传文件到 Storage Blob中,并把应用部署到Azure 中国区的Spring Cloud服务后,调用上传 ...
- 可视化技术在 Nebula Graph 中的应用
本文首发于 Nebula Graph Community 公众号 本文整理自 #可视化 on Live 主题直播,在本期直播中 3 位可视化嘉宾讲述了他们眼中的可视化,以及他们在可视化项目实践中踩过的 ...
- C++特殊类的设计与单例模式
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运算符重载,因此想要让一个类禁止拷贝, 只需让该类不能调用拷贝构造函数以及赋值运算 ...
- Jmeter 之 forEach控制器
1 添加方法: 线程组右键-> 添加 -> 逻辑控制器 ->ForEach控制器 2 作用: 可以更方便JMeter后置处理器提取出来的多组数据,也可以定义具有特定规则的数据,用 ...
- 关于minio Monitoring Metrics面板响应慢的问题
问题: 服务器ip修改之后,打开minio发现面板数据现需要三十多秒才能加载,排除了服务器cpu,内存,磁盘等的问题 原因: 之前配置过amqp监听,因服务器ip变更导致minio连不上rabbitm ...