bzoj3331 压力(圆方树)
圆方树
圆方树就是对于联通无向图中的每一个点双新建一个方点,与点双中的每个点连一条边,然后将原来的边删去。将原来的点看作圆点,新建的点看作方点。所以叫做圆方树。
性质
1.圆方树肯定是棵树(废话)。证明显然。
2.圆方树中与圆点相连的点肯定是方点。与方点相连的点肯定是圆点。
算法
根据圆方树的定义就可以知道。构建圆方树的过程实际上就是找点双的过程。本质上就是找割点。所以用tarjan来做就好了。将找出的点双中的点与新建的点连边即可。
思路
这个题就是圆方树的经典应用,先对于原图构建出圆方树。那么对于每个从S到T的路径。在圆方树上两点之间的简单路径上的圆点就是在原图中必须经过的点。然后再圆方树上差分一下就行了。
代码
/*
* @Author: wxyww
* @Date: 2019-01-22 20:03:52
* @Last Modified time: 2019-01-22 20:42:20
*/
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<bitset>
#include<vector>
using namespace std;
typedef long long ll;
const int N = 200000 + 100,logN = 20;
vector<int>E[N * 2];
ll read() {
ll x=0,f=1;char c=getchar();
while(c<'0'||c>'9') {
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9') {
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
struct node {
int u,v,nxt;
}e[N * 4];
int head[N],ejs;
void add(int u,int v) {
e[++ejs].u = u;e[ejs].v = v;e[ejs].nxt = head[u];head[u] = ejs;
}
void ADD(int u,int v) {
// printf("!!!%d %d\n",u,v);
E[u].push_back(v);E[v].push_back(u);
}
int top,sta[N];
int coljs,n,m,Q,cnt,dfn[N],low[N];
void tarjan(int u) {
dfn[u] = low[u] = ++cnt;
sta[++top] = u;
for(int i = head[u];i;i = e[i].nxt) {
int v = e[i].v;
// if(v == father) continue;
if(!dfn[v]) {
tarjan(v);
low[u] = min(low[u],low[v]);
if(low[v] >= dfn[u]) {
++n;
ADD(n,u);
while(sta[top + 1] != v) {
ADD(n,sta[top--]);
}
}
}
else low[u] = min(low[u],dfn[v]);
}
}
int dep[N];
int lca[N][logN];
void dfs(int u,int father) {
dep[u] = dep[father] + 1;
for(int i = 1;i < logN;++i)
lca[u][i] = lca[lca[u][i - 1]][i - 1];
int k = E[u].size();
for(int i = 0;i < k;++i) {
int v = E[u][i];
if(v == father) continue;
lca[v][0] = u;
dfs(v,u);
}
}
int LCA(int x,int y) {
if(dep[x] < dep[y]) swap(x,y);
for(int i = logN - 1;i >= 0;--i) {
if(dep[lca[x][i]] >= dep[y]) x = lca[x][i];
}
for(int i = logN - 1;i >= 0;--i) {
if(lca[x][i] != lca[y][i]) {
x = lca[x][i];y = lca[y][i];
}
}
if(x != y) x = lca[x][0];
return x;
}
int sum[N];
void dfs2(int u,int father) {
int k = E[u].size();
for(int i = 0;i < k;++i) {
int v = E[u][i];
if(v == father) continue;
dfs2(v,u);
sum[u] += sum[v];
}
}
int main() {
n = read(),m = read(),Q = read();
int nn = n;
for(int i = 1;i <= m;++i) {
int u = read(),v = read();
add(u,v);add(v,u);
}
tarjan(1);
dfs(1,0);
for(int i = 1;i <= Q;++i) {
int u = read(),v = read();
int L = LCA(u,v);
// printf("%d\n",L);
sum[u]++;sum[v]++;sum[L]--;sum[lca[L][0]]--;
}
dfs2(1,0);
for(int i = 1;i <= nn;++i) printf("%d\n",sum[i]);
return 0;
}
bzoj3331 压力(圆方树)的更多相关文章
- BZOJ3331 [BeiJing2013]压力[圆方树+树上差分]
圆方树新技能get.具体笔记见图连通性问题学习笔记. 这题求无向图的必经点,这个是一个固定套路:首先,一张连通的无向图中,每对点双和点双之间是以一个且仅一个割点连接起来的(如果超过一个就不能是割点了) ...
- BZOJ3331 压力 (圆方树+树上差分)
题意 略 题解 求路径上的割点. 然后就直接圆方树上差分 CODE #include <bits/stdc++.h> using namespace std; inline void rd ...
- BZOJ 压力 tarjan 点双联通分量+树上差分+圆方树
题意 如今,路由器和交换机构建起了互联网的骨架.处在互联网的骨干位置的核心路由器典型的要处理100Gbit/s的网络流量. 他们每天都生活在巨大的压力之下.小强建立了一个模型.这世界上有N个网络设备, ...
- 仙人掌&圆方树
仙人掌&圆方树 Tags:图论 [x] [luogu4320]道路相遇 https://www.luogu.org/problemnew/show/P4320 [ ] [SDOI2018]战略 ...
- 仙人掌 && 圆方树 && 虚树 总结
仙人掌 && 圆方树 && 虚树 总结 Part1 仙人掌 定义 仙人掌是满足以下两个限制的图: 图完全联通. 不存在一条边处在两个环中. 其中第二个限制让仙人掌的题做 ...
- Traffic Real Time Query System 圆方树+LCA
题目描述 City C is really a nightmare of all drivers for its traffic jams. To solve the traffic problem, ...
- Note -「圆方树」学习笔记
目录 圆方树的定义 圆方树的构造 实现 细节 圆方树的运用 「BZOJ 3331」压力 「洛谷 P4320」道路相遇 「APIO 2018」「洛谷 P4630」铁人两项 「CF 487E」Touris ...
- 圆方树简介(UOJ30:CF Round #278 Tourists)
我写这篇博客的原因 证明我也是学过圆方树的 顺便存存代码 前置技能 双联通分量:点双 然后就没辣 圆方树 建立 新建一个图 定义原图中的所有点为圆点 对于每个点双联通分量(只有两个点的也算) 建立一个 ...
- 洛谷P4630 铁人两项--圆方树
一道很好的圆方树入门题 感谢PinkRabbit巨佬的博客,讲的太好啦 首先是构建圆方树的代码,也比较好想好记 void tarjan(int u) { dfn[u] = low[u] = ++dfn ...
随机推荐
- restful 规范(建议)
需求:开发cmdb,对用户进行管理. 做前后端分离,后端写api(URL),对用户表进行增删改查,应该写四个URL(还要给文档(返回值,返回,请求成功,干嘛,失败,干嘛)),然后分别写视图函数. ht ...
- springboot项目小总结
使用模板引擎 thyemlef 可以直接将 html文件进行导入 loginhtml文件 html中常用的表达式 <link href="asserts/css/signin.cs ...
- Python 中关于 round 函数的小坑
参考: http://www.runoob.com/w3cnote/python-round-func-note.html
- 安装使用阿里云的yum源
CentOS 1.备份(备份本地Yum源) mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak 2.下 ...
- Zend Framework2从入门到精通
1. 下载安装zf2的web程序 步骤: 第一步,保证得到一个基本的zf2框架 直接从官网下载并解压即可:http://www.zendframework.org.cn/downloads/lates ...
- Attention Model
参考1: https://blog.csdn.net/malefactor/article/details/50550211 attention部分实现: https://blog.csdn.net ...
- freemarker 设置中文
在web中添加一段代码 <servlet> <servlet-name>freemarker</servlet-name> <servlet-class> ...
- poj2186(tarjan缩点)
题意:有n头奶牛,假如奶牛A觉得奶牛B很厉害,那么就有一条由A指向B的边,然后有个传递关系,if(A→B,B→C,那么A→C),让你求出被除了自己以外所有的奶牛都认为厉害的的奶牛个数: 解题思路:看到 ...
- gym-101350D
题意:给你一个数组,你每次可以是其中一个数减一,数组其他元素加一,问是否能够相等,这个数组的所有元素. 解题思路:将数组从小到大排序,只要后一项减去当前项的值是奇数就行了. 代码: #include& ...
- java Builder模式创建不可变类
package com.geostar.gfstack.operationcenter.logger.manager.common; /** * Created by Nihaorz on 2017/ ...