bzoj 3331: [BeiJing2013]压力
Description
Input
Output
Sample Input
1 2
1 3
2 3
1 4
4 2
4 3
Sample Output
1
1
2
HINT
【样例解释】
设备1、2、3之间两两有链接,4只和1有链接。4想向2和3各发送一个数据
包。显然,这两个数据包必须要经过它的起点、终点和1。
【数据规模和约定】
对于40%的数据,N,M,Q≤2000
对于60%的数据,N,M,Q≤40000
对于100%的数据,N≤100000,M,Q≤200000
Source
mdzz,到今天才会点双缩点。。。(其实也不算缩点,只是通过添加虚拟点使原图转为树)
对于比较杂乱的图一般都是通过重构变为比较好维护信息的图,
题目中必经点肯定是割点。。。然后重构成树后就很好维护了。
以前打的点双没有用栈实现,是求出来后再dfs一遍求出,这样就去掉了图中的割点,导致我后来yy的时候连出了好多环。。。;
如果用栈实现的话,先把所有的点双求出来,把原图所有边都删去,在新图中,对于每个点双新建一个虚拟点,然后把点双中的所有点向这个虚拟点连无向边;
因为点双之间是以割点为交连起来的,所以新建图中仍能够保持连通性。有点强劲有力。。。
建成树后,因为只有一次询问,所以可以树上差分,由于是点的差分,所以和边的差分有所不同:
是cf[lca]--,使lca只加一次,再cf[fa[lca]]--,是fa[lca]保持不变;
// MADE BY QT666
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
typedef long long ll;
const int N=500050;
int gi(){
int x=0,flag=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-') flag=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return x*flag;
}
int cnt,head[N],nxt[N],to[N],n,m,q,tt,dfn[N],low[N],iscut[N],vis[N],tot,pos[N],vis2[N],rt;
int size[N],son[N],top[N],deep[N],fa[N],cf[N],ans[N],zhan[N],num,sum;
vector<int>p[N],bcc[N];
void lnk(int x,int y){
to[++cnt]=y,nxt[cnt]=head[x],head[x]=cnt;
to[++cnt]=x,nxt[cnt]=head[y],head[y]=cnt;
}
void tarjan(int x){
dfn[x]=low[x]=++tt;zhan[++sum]=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]);
if(low[y]>=dfn[x]){
num++;int tmp;
do{
tmp=zhan[sum--];
bcc[num].push_back(tmp);
}while(tmp!=y);
bcc[num].push_back(x);
}
}
else low[x]=min(low[x],dfn[y]);
}
}
void dfs1(int x,int f){
size[x]=1;deep[x]=deep[f]+1;fa[x]=f;
for(int i=0;i<p[x].size();i++){
int y=p[x][i];
if(y!=f){
dfs1(y,x);size[x]+=size[y];
if(size[y]>size[son[x]]) son[x]=y;
}
}
}
void dfs2(int x,int f){
top[x]=f;
if(son[x]) dfs2(son[x],f);
for(int i=0;i<p[x].size();i++){
int y=p[x][i];
if(y!=fa[x]&&y!=son[x]) dfs2(y,y);
}
}
int lca(int x,int y){
while(top[x]!=top[y]){
if(deep[top[x]]<deep[top[y]]) swap(x,y);
x=fa[top[x]];
}
if(deep[x]<deep[y]) swap(x,y);
return y;
}
void count(int x){
for(int i=0;i<p[x].size();i++){
int y=p[x][i];
if(y!=fa[x])count(y),cf[x]+=cf[y];
}
}
void rebuild(){
for(int i=1;i<=num;i++){
for(int j=0;j<bcc[i].size();j++){
int x=bcc[i][j];cout<<x<<' ';
p[x].push_back(i+n);p[i+n].push_back(x);
}
cout<<endl;
}
}
int main(){
n=gi(),m=gi(),q=gi();
for(int i=1;i<=m;i++){
int x=gi(),y=gi();lnk(x,y);
}
tarjan(1);tot=n;rebuild();
dfs1(1,0);dfs2(1,1);
for(int i=1;i<=q;i++){
int u=gi(),v=gi(),LCA=lca(u,v);
cf[u]++,cf[v]++,cf[LCA]--,cf[fa[LCA]]--;
}
count(1);for(int i=1;i<=n;i++) printf("%d\n",cf[i]);
return 0;
}
bzoj 3331: [BeiJing2013]压力的更多相关文章
- BZOJ 3331 [BeiJing2013]压力-Tarjan + 树上差分
Solution Tarjan 点双缩点, 加上树上差分计算. 注意特判... 我特判挂了好久呜呜呜 Code #include<cstdio> #include<cstring&g ...
- 3331: [BeiJing2013]压力
3331: [BeiJing2013]压力 LCA+树上差分,和之前类似的题差不多,就是多了个v-dcc缩点,唯一要注意的就是判断是否是割点,对于不是割点的点,如果他是起点或重点,ans++,和差分没 ...
- Solution -「BZOJ 3331」压力
\(\mathcal{Description}\) Link. 给定一个 \(n\) 个点 \(m\) 条边的连通无向图,并给出 \(q\) 个点对 \((u,v)\),令 \(u\) 到 \ ...
- BZOJ3331: [BeiJing2013]压力
传送门 Tarjan的三大应用之一:求解点双联通分量. 求解点双联通分量.然后缩点,差分优化即可. //BZOJ 3331 //by Cydiater //2016.10.29 #include &l ...
- 【BZOJ3331】[BeiJing2013]压力 Tarjan求点双
[BZOJ3331][BeiJing2013]压力 Description 如今,路由器和交换机构建起了互联网的骨架.处在互联网的骨干位置的核心路由器典型的要处理100Gbit/s的网络流量.他们每天 ...
- BZOJ3331 [BeiJing2013]压力[圆方树+树上差分]
圆方树新技能get.具体笔记见图连通性问题学习笔记. 这题求无向图的必经点,这个是一个固定套路:首先,一张连通的无向图中,每对点双和点双之间是以一个且仅一个割点连接起来的(如果超过一个就不能是割点了) ...
- BZOJ 3331 (Tarjan缩点+树上差分)
题面 传送门 分析 用Tarjan求出割点,对点-双连通分量(v-DCC)进行缩点,图会变成一棵树 注意v-DCC的缩点和e-DCC不同,因为一个割点可能属于多个v-DCC 设图中共有p个割点和t个v ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- Note -「圆方树」学习笔记
目录 圆方树的定义 圆方树的构造 实现 细节 圆方树的运用 「BZOJ 3331」压力 「洛谷 P4320」道路相遇 「APIO 2018」「洛谷 P4630」铁人两项 「CF 487E」Touris ...
随机推荐
- web离线应用--dom storage
web离线应用--dom storage dom storage是html5添加的新功能,其实也不是什么新的应用,只不过是cookie的放大版本,由于cookie的大小只有4kb,而且在每次请求一个新 ...
- window.location.href跳转至空白页
现象:window.location.href = "XXX"调到了空白页,但是将XXX在窗口地址栏输入就会可以访问到. 原因:就是XXX前缀没有加上"http://&q ...
- netty源码分析
1.Netty是由JBOSS提供的一个java开源框架.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器和客户端程序.也就是说,Netty 是一个基于N ...
- YII2连表分页
控制器(controller)页面 use \yii\data\Pagination; //引入这个类 public function actionList(){ $data = Clock::fin ...
- JAVA读取、写入Excel表格(含03版)
引言 工作中可能会遇到对Excel读取和写入,如果我们自己手动写的话,会很麻烦,但是Apache中有poi工具类.poi工具类封装好了对于Excel读取和写入,我们需要用的时候,直接调用该方法就好了. ...
- Web前端学习——HTML
HTML其实还是蛮容易学习的,无非就是一些标签.格式的填写,大学的时候也做过网站设计,所以这里主要记录一些常用的HTML标签.属性以及书写方法等. 一.常见HTML格式 主要包含文件type,html ...
- Codeforces 869E The Untended Antiquity
题意:给定一个网格图,三种操作:1.在(r1,c1,r2,c2)处建围墙.2.删除(r1,c1,r2,c2)处的围墙.3.询问两点是否可达 思路比较巧妙,将围墙内的点赋加一个权值,询问的时候判断两个点 ...
- python 3.6 MJ小工具
2017.07.14 update 做了个界面,不需要使用cmd命令行+文件路径的方式来使用了: 链接如下: http://www.cnblogs.com/chenyuebai/p/7150382.h ...
- Python Django CMDB项目实战之-2创建APP、建模(models.py)、数据库同步、高级URL、前端页面展示数据库中数据
基于之前的项目代码来编写 Python Django CMDB项目实战之-1如何开启一个Django-并设置base页index页文章页面 现在我们修改一个文章列表是从数据库中获取数据, 下面我们就需 ...
- nginx HTTP/2.0 配置
1.前言 最近无意中看到http2.0消息,发现自己的博客虽然配了https,但并没有配置http2.0,所以搞了个玩玩,本以为配个参数就搞定了,结果还是折腾了一个小时. 2.过程 nginx并没有默 ...