【BZOJ3495】PA2010 Riddle
题目大意
有\(n\)个城镇被分成了\(k\)个郡,有\(m\)条连接城镇的无向边。要求给每个郡选择一个城镇作为首都,满足每条边至少有一个端点是首都。
题目分析
每条边至少有一个端点是首都,每个郡至多一个首都,很容易想到\(2-sat\)判定。
考虑如何建边。我们用\(x\)表示在编号为\(x\)的节点建首都,\(x'\)表示不在该点建首都。
对于一条边的两个端点,若左端点\(l\)不为首都,则右端点\(r\)必为首都;右端点同理,因此\(l\)向\(r'\)连边,\(r\)向\(l'\)连边。
对于同一个郡内的点,若\(a_1\)为首都,则其他点都不能为首都,按照套路我们应取郡内每一个点\(a_i'\)向郡内其他点\(a_j'\)连边。但这样边数是\(n^2\)级别的,难以接受。
于是考虑优化建边。观察同一个郡内的点集\(\{a_1,a_2,...,a_n\}\),我们发现建边时,有许多重复的边\((\)如选择\(a_3\)和\(a_4\)作为首都,那么\(\{a_1,a_2\}\)以及\(\{a_5,a_6\}\)都不能作为首都\()\),因此我们很容易想到前缀与后缀优化连边。
我们新增虚节点\(a_i''\),并且\(a_{i+1}''\)向\(a_{i}''\)连边,\(a_i''\)向\(a_i'\)连边,那么如果选择\(a_i\)作为首都,对于\(a_j(j<i)\)就只需要\(a_i\)向\(a_{i-1}''\)连边即可。这是前缀优化。对于\(a_j(j>i)\)同理用后缀优化即可。
#include <bits/stdc++.h>
using namespace std;
int getint(){
int w=0;char ch=getchar();
while(ch<'0'||ch>'9')ch=getchar();
while(ch>='0'&&ch<='9')w=w*10+ch-'0',ch=getchar();
return w;
}
const int maxn=4000005;
int n,m,k,h[maxn],dfn[maxn],low[maxn],st[maxn],bel[maxn],scc,sign,top;
bool instack[maxn];
struct edge{int to,next;}e[maxn*5];
void addedge(int x,int y){
static int cnt;
e[++cnt]=(edge){y,h[x]};h[x]=cnt;
}
struct info{int x,i,y;};
void dfs(int x){
static info S[maxn];
static int Top;
int i,y;
call:
dfn[x]=low[x]=++sign;st[++top]=x;instack[x]=1;
for(i=h[x];i;i=e[i].next){
y=e[i].to;
if(!dfn[y]){
S[++Top]=(info){x,i,y};
x=y;goto call;
Return:;
low[x]=min(low[x],low[y]);
}
else if(instack[y])low[x]=min(low[x],dfn[y]);
}
if(low[x]==dfn[x]){
scc++;
for(;;){
int y=st[top--];
instack[y]=0;bel[y]=scc;
if(y==x)break;
}
}
if(Top){x=S[Top].x;i=S[Top].i;y=S[Top].y;Top--;goto Return;}
}
int main(){
// freopen("capital.in","r",stdin);
// freopen("capital.out","w",stdout);
n=getint();m=getint();k=getint();
for(int i=1;i<=m;i++){
int x=getint(),y=getint();
addedge(x+n,y);addedge(y+n,x);
}
for(int i=1;i<=k;i++){
int x=getint();
for(int j=1;j<=x;j++)st[j]=getint();
for(int j=x;j>1;j--)addedge(st[j]+2*n,st[j-1]+2*n);
for(int j=1;j<x;j++)addedge(st[j]+3*n,st[j+1]+3*n);
for(int j=1;j<=x;j++){
if(j>1)addedge(st[j],st[j-1]+2*n);
if(j<x)addedge(st[j],st[j+1]+3*n);
}
}
for(int i=1;i<=n;i++)addedge(i+2*n,i+n),addedge(i+3*n,i+n);
for(int i=1;i<=4*n;i++)if(!dfn[i])dfs(i);
bool flag=0;
for(int i=1;i<=n;i++)if(bel[i]==bel[i+n])flag=1;
if(!flag)puts("TAK");
else puts("NIE");
}
【BZOJ3495】PA2010 Riddle的更多相关文章
- 【bzoj 3495】PA2010 Riddle
Description 有n个城镇被分成了k个郡,有m条连接城镇的无向边.要求给每个郡选择一个城镇作为首都,满足每条边至少有一个端点是首都. Input 第一行有三个整数,城镇数n(1<=n&l ...
- 【BZOJ】3495: PA2010 Riddle 2-SAT算法
[题意]有n个城镇被分成了k个郡,有m条连接城镇的无向边.要求给每个郡选择一个城镇作为首都,满足每条边至少有一个端点是首都.n,m,k<=10^6. [算法]2-SAT,前后缀优化建图 [题解] ...
- 【CF Manthan, Codefest 17 A】Tom Riddle's Diary
[链接]h在这里写链接 [题意] 在这里写题意 [题解] /* Be careful. 二重循环枚举 */ [错的次数] 0 [反思] 在这了写反思 [代码] #include <bits/st ...
- Codeforces Round #455 (Div. 2) A. Generate Login【贪心】
A. Generate Login time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...
- Python高手之路【六】python基础之字符串格式化
Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...
- 【原】谈谈对Objective-C中代理模式的误解
[原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...
- 【原】FMDB源码阅读(三)
[原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...
- 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新
[原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...
- 【调侃】IOC前世今生
前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...
随机推荐
- WPF Binding的值转换器
注意:值转换器中用于传入额外信息的参数 parameter 在 Binding 时使用 Binding 对象的 ConverterParameter 属性指定,但是设置了 ConverterParam ...
- [转]创建节约内存的JavaBean
转自:创建节约内存的JavaBean 如果编写节约内存的java对象 编写Java代码的时候,大多数情况下,我们很少关注一个Java对象究竟有多大(占据多少内存),更多的是关注业务与逻辑.但是殊不知, ...
- Blockly
Blockly简介 A library for building visual programming editors. Blockly 是个库,可用来构建可视化编程编辑器 Blockly is b ...
- jenkins 部署应用
一,安装rpm包 安装jdk 安装jenkins 查看jdk是否安装成功 启动jenkins systemctl start jenkins 开机自启 systemctl enable jenkins ...
- python 爬虫系列08-同步斗图一波
一波大图来袭 import requests from lxml import etree from urllib import request import os import re def par ...
- Manacher算法(马拉车)
学习博客:https://www.cnblogs.com/love-yh/p/7072161.html 首先,得先了解什么是回文串(我之前就不是很了解,汗).回文串就是正反读起来就是一样的,如“abb ...
- vue嵌套路由 && 404重定向
第一部分: vue嵌套路由 嵌套路由是什么? 嵌套路由就是在一个被路由过来的页面下可以继续使用路由,嵌套也就是路由中的路由的意思. 比如在vue中,我们如果不使用嵌套路由,那么只有一个<rou ...
- 023-将表单序列化为json对象
使用jQuery将表单序列化为json对象,其中serializeJson方法的名字任意,serializeArray()这个jQuery提供的方法.this指的就是谁调用了这个方法. $.fn.se ...
- TOJ 2857 Stockbroker Grapevine
描述 Stockbrokers are known to overreact to rumours. You have been contracted to develop a method of s ...
- 迪米特法則 Law of Demeter
又稱為"最小知識"原則, 若對Law of Demeter做一個簡單總結: 任何對象的任何方法只能調用以下對象中的方法: (1) 該對象本身 (2) 所傳入的參數對象 (3) 它所 ...