【洛谷4606】[SDOI2018] 战略游戏(广义圆方树+虚树)
时间:2021-07-12
本文章向大家介绍【洛谷4606】[SDOI2018] 战略游戏(广义圆方树+虚树),主要包括【洛谷4606】[SDOI2018] 战略游戏(广义圆方树+虚树)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
- 给定一张\(n\)个点\(m\)条边的无向图。
- \(q\)次询问,每次给出一组关键点,求有多少个非关键点被删去后会导致存在关键点不连通。
- 数据组数\(\le10\),\(n,q\le10^5\)
圆方树+虚树
口胡起来很简单。
我们求出原图的圆方树,每次询问建出虚树,答案就是虚树上圆点个数-关键点数。
注意广义圆方树的建法。
代码:\(O(\sum|S|)\)
#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Rg register
#define RI Rg int
#define Cn const
#define CI Cn int&
#define I inline
#define W while
#define N 100000
#define M 200000
#define LN 19
#define add(x,y) (e[++ee].nxt=lnk[x],e[lnk[x]=ee].to=y)
using namespace std;
int n,m,k,s[2*N+5],ee,lnk[N+5];struct edge {int to,nxt;}e[2*M+5];
namespace FastIO
{
#define FS 100000
#define tc() (FA==FB&&(FB=(FA=FI)+fread(FI,1,FS,stdin),FA==FB)?EOF:*FA++)
#define pc(c) (FC==FE&&(clear(),0),*FC++=c)
int OT;char oc,FI[FS],FO[FS],OS[FS],*FA=FI,*FB=FI,*FC=FO,*FE=FO+FS;
I void clear() {fwrite(FO,1,FC-FO,stdout),FC=FO;}
Tp I void read(Ty& x) {x=0;W(!isdigit(oc=tc()));W(x=(x<<3)+(x<<1)+(oc&15),isdigit(oc=tc()));}
Ts I void read(Ty& x,Ar&... y) {read(x),read(y...);}
Tp I void writeln(Ty x) {W(OS[++OT]=x%10+48,x/=10);W(OT) pc(OS[OT--]);pc('\n');}
}using namespace FastIO;
namespace RST//广义圆方树
{
int ct,ee,lnk[2*N+5];struct edge {int to,nxt;}e[4*N+5];I void Add(CI x,CI y) {add(x,y),add(y,x);}
int d,dI[2*N+5],dO[2*N+5],D[2*N+5],V[2*N+5],f[2*N+5][LN+1];I void Init(CI x=1)
{
RI i;for(i=1;i<=LN;++i) f[x][i]=f[f[x][i-1]][i-1];
for(dI[x]=++d,i=lnk[x];i;i=e[i].nxt) e[i].to^f[x][0]&&
(D[e[i].to]=D[f[e[i].to][0]=x]+1,V[e[i].to]=V[x]+(e[i].to<=n),Init(e[i].to),0);dO[x]=d;
}
I int LCA(RI x,RI y)
{
RI i;for(D[x]<D[y]&&(swap(x,y),0),i=0;D[x]^D[y];++i) (D[x]^D[y])>>i&1&&(x=f[x][i]);
if(x==y) return x;for(i=LN;~i;--i) f[x][i]^f[y][i]&&(x=f[x][i],y=f[y][i]);return f[x][0];
}
I bool cmp(CI x,CI y) {return dI[x]<dI[y];}
int vis[2*N+5],S[2*N+5];I void Solve()//建虚树
{
RI i;for(i=1;i<=k;++i) vis[s[i]]=1;sort(s+1,s+k+1,cmp);
RI t,nk=k;for(i=1;i^k;++i) !vis[t=LCA(s[i],s[i+1])]&&(vis[s[++nk]=t]=1);sort(s+1,s+nk+1,cmp);//添上相邻两点LCA
RI T;for(t=(S[T=1]=s[1])<=n,i=2;i<=nk;t+=V[s[i]]-V[S[T]],S[++T]=s[i++]) W(dI[s[i]]>dO[S[T]]) --T;//求出虚树上点数
for(writeln(t-k),i=1;i<=nk;++i) vis[s[i]]=0;//减去关键点数得到答案;清空
}
I void Cl() {d=ee=ct=0;for(RI i=1;i<=2*n;++i) lnk[i]=0;V[1]=1;}
}
int d,dfn[N+5],low[N+5],T,S[N+5];I void Tarjan(CI x=1)//建广义圆方树
{
dfn[x]=low[x]=++d,S[++T]=x;for(RI i=lnk[x],y,t;i;i=e[i].nxt)
{
if(dfn[y=e[i].to]) {low[x]=min(low[x],dfn[y]);continue;}//访问过
if(Tarjan(y),low[y]>=dfn[x]) {RST::Add(n+(++RST::ct),x);W(RST::Add(n+RST::ct,S[T]),S[T--]^y);continue;}//找到一个点双
low[x]=min(low[x],low[y]);
}
}
int main()
{
RI Tt,Qt,i,x,y;read(Tt);W(Tt--)
{
for(read(n,m),RST::Cl(),d=ee=0,i=1;i<=n;++i) lnk[i]=dfn[i]=0;//清空
for(i=1;i<=m;++i) read(x,y),add(x,y),add(y,x);Tarjan(),RST::Init();
read(Qt);W(Qt--) {for(read(k),i=1;i<=k;++i) read(s[i]);RST::Solve();}
}return clear(),0;
}
败得义无反顾,弱得一无是处
原文地址:https://www.cnblogs.com/chenxiaoran666/p/Luogu4606.html
- CSS3矩阵变换
- 可直接运行
- Ryu:网络时延探测应用
- box布局
- Event Loop
- 把图片变成字体,然后在引入到网页
- Flutter环境搭建
- java.net.ConnectException: Call From slaver1/192.168.19.128 to slaver1:8020 failed on connection exc
- 18/03/18 04:53:44 WARN TaskSchedulerImpl: Initial job has not accepted any resources; check your clu
- 技术干货 | Hadoop3.0稳定版安装攻略来啦!
- ios逆向工具MonkeyDev简介
- 自定义下拉列表
- 身份证号码验证算法
- 技术干货 | hive安装部署
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- laravel-admin自动生成模块,及相关基础配置方法
- laravel-admin select框默认选中的方法
- Laravel-admin之修改操作日志的方法
- php使用curl伪造浏览器访问操作示例
- 关于laravel后台模板laravel-admin select框的使用详解
- 基于Laravel-admin 后台的自定义页面用法详解
- php解决约瑟夫环算法实例分析
- 浅谈laravel-admin的sortable和orderby使用问题
- 使用composer安装使用thinkphp6.0框架问题【视频教程】
- 基于laravel-admin 后台 列表标签背景的使用方法
- 解决laravel-admin 自己新建页面里 js 需要刷新一次的问题
- laravel-admin 中列表筛选方法
- Laravel框架控制器的middleware中间件用法分析
- laravel-admin的图片删除实例
- 在laravel-admin中列表中禁止某行编辑、删除的方法