NOIP 模拟 7 回家
题解
第一眼,板子题,不就是一个缩点吗?后来一想不对,哪有这么傻的出题人呢,出个这水题。
一想,不对,不仅要求割点,还要判断这个割点是否在搜索树 \(n\) 的祖先上。想到这后,我哈哈大笑,还想坑我,我早就识破了你诡计。
啪啪打脸。考完才发现是我天真了。搜索树上不一定只包含必经点,因为搜索顺序问题,我们还会因为有环多算上点。所以我们要进行缩点。
缩点后我们就可以保证无环且是棵数了。
其实避免这种情况有两种方法:
1.我们在 tajan 完后的搜索树上从根跳算对于 n 的割点,而不是整个图的割点
2.缩点
注意我们只用判自环而不用判重边,在 \(tarjan\) 的时候判一下就行,减小常数。
\(AC\kern 0.4emCODE:\)
Code
#include<bits/stdc++.h>
#define ri register int
#define p(i) ++i
using namespace std;
namespace IO{
char buf[1<<21],*p1=buf,*p2=buf;
#define gc() p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++
inline int read() {
ri x=0,f=1;char ch=gc();
while(ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=gc();}
while(ch>='0'&&ch<='9') {x=(x<<1)+(x<<3)+(ch^48);ch=gc();}
return x*f;
}
}
using IO::read;
namespace nanfeng{
#define pb(x) push_back(x)
#define cmax(x,y) ((x)>(y)?(x):(y))
#define cmin(x,y) ((x)>(y)?(y):(x))
#define FI FILE *IN
#define FO FILE *OUT
static const int N=3.4e5+7;
int dfn[N],low[N],cut[N],first[N],f[N],st[N],id[N],be[N],bac[N],T,rt,tot,cnt,num,cntd,t=1,n,m,tp;
struct edge{int v,nxt;}e[N<<2];
vector<int> dcc[N];
inline void add(int u,int v) {
e[t].v=v;
e[t].nxt=first[u];
first[u]=t++;
}
void dfst(int x,int last) {
dfn[x]=low[x]=p(tot);
int fg=0;
st[p(tp)]=x;
for (ri i(first[x]),v;i;i=e[i].nxt) {
if (!dfn[v=e[i].v]) {
dfst(v,x);
low[x]=cmin(low[x],low[v]);
if (low[v]>=dfn[x]) {
p(fg);
if (x!=rt||fg>1) cut[x]=1;
p(cnt);
int tmp;
while((tmp=st[tp--])!=v) dcc[cnt].pb(tmp);
dcc[cnt].pb(v);dcc[cnt].pb(x);
}
} else if(v!=last) low[x]=cmin(low[x],dfn[v]);
}
}
void dfs(int x,int fa) {
f[x]=fa;
for (ri i(first[x]),v;i;i=e[i].nxt) {
if ((v=e[i].v)==fa) continue;
dfs(v,x);
}
}
inline void init() {
memset(first,0,sizeof(first));
cntd=cnt=tot=tp=0,t=1;
for (ri i(1);i<=n;p(i)) dcc[i].clear();
memset(cut,0,sizeof(cut));
memset(dfn,0,sizeof(dfn));
memset(low,0,sizeof(low));
memset(be,0,sizeof(be));
}
inline int main() {
// FI=freopen("nanfeng.in","r",stdin);
// FO=freopen("nanfeng.out","w",stdout);
T=read();
for (ri z(1);z<=T;p(z)) {
n=read(),m=read();
init();
for (ri i(1);i<=m;p(i)) {
int u=read(),v=read();
if (u==v) continue;
add(u,v);add(v,u);
}
for (ri i(1);i<=n;p(i)) if (!dfn[i]) rt=i,dfst(i,0);
t=1;num=cnt;
memset(first,0,sizeof(first));
for (ri i(1);i<=n;p(i)) if (cut[i]) id[i]=p(num),bac[num]=i;
for (ri i(1);i<=cnt;p(i)) {
for (ri j(0);j<dcc[i].size();p(j)) {
int x=dcc[i][j];
if (cut[x]) add(id[x],i),add(i,id[x]);
else be[x]=i;
}
}
if (cut[1]) dfs(id[1],0);
else dfs(be[1],0);
int x=cut[n]?f[id[n]]:f[be[n]];
while(f[x]) {
if (x>cnt) cut[bac[x]]=2,p(cntd);
x=f[x];
}
printf("%d\n",cntd);
for (ri i(cnt+1);i<=num;p(i)) if (cut[bac[i]]==2) printf("%d ",bac[i]);
puts("");
}
return 0;
}
}
int main() {return nanfeng::main();}
NOIP 模拟 7 回家的更多相关文章
- NOIP模拟赛20161022
NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
- NOIP模拟赛 by hzwer
2015年10月04日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...
- 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程
数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...
- 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...
- 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...
- 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...
- CH Round #58 - OrzCC杯noip模拟赛day2
A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...
- CH Round #52 - Thinking Bear #1 (NOIP模拟赛)
A.拆地毯 题目:http://www.contesthunter.org/contest/CH%20Round%20%2352%20-%20Thinking%20Bear%20%231%20(NOI ...
随机推荐
- 2012年第三届蓝桥杯C/C++程序设计本科B组省赛 方阵旋转(代码填空)
方阵旋转 对一个方阵转置,就是把原来的行号变列号,原来的列号变行号 例如,如下的方阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 转置后变为: 1 5 9 13 2 ...
- 关于varnish缓存
目录 缓存的概念 一.varnish缓存 1. 简介 2. 总体结构 2.1 两个主进程 2.1.1 Management进程 2.1.2 Child/Cacher进程 2.2 Varnish的日志收 ...
- [NOI2009] 诗人小G [题解]
诗人小G 题目大意 给出 \(n\) 个长度不超过 \(30\) 的句子,要求你对其进行排版. 对于每一行,有一个规定的行标准长度 \(L\) ,每一行的不协调度等于该行的实际长度与行标准长度差的绝对 ...
- Java开源协同办公项目:数据中心,自定义查询语句使用教程
O2OA提供的数据管理中心,可以让用户通过配置的形式完成对数据的汇总,统计和数据分组展现,查询和搜索数据形成列表数据展现.也支持用户配置独立的数据表来适应特殊的业务的数据存储需求.本文主要介绍如何在O ...
- MySQL Orchestrator自动导换+VIP切换
目录 Orchestrator总体结构... 测试环境信息... Orchestrator详细配置... SSH免密配置... /etc/hosts配置... visudo配置... /e ...
- mysql实现主从复制、读写分离的配置方法(一)
1. 测试环境 两个CentOS7虚拟机 mysql 5.5-MariaDB master_ip:192.168.1.109 slave_ip:192.168.1.118 2. 配置主服务器 2.1 ...
- windows下搭建vue开发环境实践
Vue.js是一套构建用户界面的 "渐进式框架".与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计.Vue 的核心库只关注视图层,并且非常容易学习,非常容易与其它库或已 ...
- 动态 WebApi 引擎使用教程(3行代码完成动态 WebApi 构建)
目录 什么是 WebApiEngine? 开源地址 使用方法 使用 [ApiBind] 标签让任何方法变成 WebApi 对 API 进行分类 自定义 API 名称 复制特性 为整个类配置 WebAp ...
- 搭建kerberos和NTP服务器以及安全的NFS服务
说明:这里是Linux服务综合搭建文章的一部分,本文可以作为单独搭建Kerberos和NTP时钟服务的参考. 注意:这里所有的标题都是根据主要的文章(Linux基础服务搭建综合)的顺序来做的. 如果需 ...
- C++引用的概念以及基本使用
引言 引用是C++的新增内容,在实际开发中会经常使用:C++用的引用就如同C语言的指针一样重要,但它比指针更加方便和易用. 我们知道,参数的传递本质上是一次赋值的过程,即将一块内存上的数据复制到另一块 ...