3331: [BeiJing2013]压力

Description

如今,路由器和交换机构建起了互联网的骨架。处在互联网的骨干位置的核心路由器典型的要处理100Gbit/s的网络流量。他们每天都生活在巨大的压力之下。

小强建立了一个模型。这世界上有N个网络设备,他们之间有M个双向的链接。这个世界是连通的。在一段时间里,有Q个数据包要从一个网络设备发送到另一个网络设备。

一个网络设备承受的压力有多大呢?很显然,这取决于Q个数据包各自走的路径。不过,某些数据包无论走什么路径都不可避免的要通过某些网络设备。

你要计算:对每个网络设备,必须通过(包括起点、终点)他的数据包有多少个?

Input

第一行包含3个由空格隔开的正整数N,M,Q。

接下来M行,每行两个整数u,v,表示第u个网络设备(从1开始编号)和

第v个网络设备之间有一个链接。u不会等于v。两个网络设备之间可能有多个链接。

接下来Q行,每行两个整数p,q,表示第p个网络设备向第q个网络设备发送了一个数据包。p不会等于q。

Output

输出N行,每行1个整数,表示必须通过某个网络设备的数据包的数量。

Sample Input

4 4 2
1 2
1 3
2 3
1 4
4 2
4 3

Sample Output

2
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

题解

先讲一下圆方树

首先要知道有一种图叫仙人掌

仙人掌就是一个没有共边环的连通图

如图:

这样就不是仙人掌(因为有共边环):

这样也不是(因为不连通):

我们定义原图中的每个点是圆点

对于每个环,我们可以新建一个方点,然后把原来环上的边删掉,把该环上所以的点连向这个方点:

圆方树就构好啦

广义圆方树就是对于任意图,我们对于每一个点双新建一个方点,然后点双中所有点向方点连边

其实建广义圆方树和建圆方树的代码是一样的

然后我们来看上面的题目

就会发现它是一道广义圆方树的板题

直接把广义圆方树建出来,然后树上差分一下就好啦

树剖一下就A了

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
inline int gi()
{char c;int num=0,flg=1;while((c=getchar())<'0'||c>'9')if(c=='-')flg=-1;while(c>='0'&&c<='9'){num=num*10+c-48;c=getchar();}return num*flg;
}
#define N 200005
#define M 400005
int fir[N],nxt[2*N],to[2*N],cnt;
void adde(int a,int b)
{to[++cnt]=b;nxt[cnt]=fir[a];fir[a]=cnt;to[++cnt]=a;nxt[cnt]=fir[b];fir[b]=cnt;
}
int dfn[N],low[N],stk[N],tp,dc,pbccnt;
vector<int> pbc[N];
void dfs(int u,int fa)
{dfn[u]=low[u]=++dc;stk[tp++]=u;int v,p;for(p=fir[u];p;p=nxt[p]){v=to[p];if(!dfn[v]){dfs(v,u);low[u]=min(low[u],low[v]);if(low[v]>=dfn[u]){pbccnt++;while(tp>0){pbc[pbccnt].push_back(stk[--tp]);if(stk[tp]==v)break;}pbc[pbccnt].push_back(u);}}else if(v!=fa) low[u]=min(low[u],dfn[v]);}
}
int fa[N],dep[N],son[N],siz[N],top[N];
void dfs1(int u)
{dep[u]=dep[fa[u]]+1;int v,p;siz[u]=1;for(p=fir[u];p;p=nxt[p]){v=to[p];if(v!=fa[u]){fa[v]=u;dfs1(v);siz[u]+=siz[v];if(siz[son[u]]<siz[v])son[u]=v;}}
}
void dfs2(int u)
{if(son[u]) top[son[u]]=top[u],dfs2(son[u]);int v,p;for(p=fir[u];p;p=nxt[p]){v=to[p];if(v!=son[u]&&v!=fa[u])top[v]=v,dfs2(v);}
}
int LCA(int x,int y)
{while(top[x]!=top[y]){if(dep[top[x]]<dep[top[y]])swap(x,y);x=fa[top[x]];}return dep[x]<dep[y]?x:y;
}
int sum[N];
void solve(int u)
{int v,p;for(p=fir[u];p;p=nxt[p]){v=to[p];if(v!=fa[u]){solve(v);sum[u]+=sum[v];}}
}
int main()
{int n,m,Q,i,j,k,u,v;n=gi();m=gi();Q=gi();for(i=1;i<=m;i++){u=gi();v=gi();adde(u,v);}for(i=1;i<=n;i++)if(!dfn[i]) dfs(i,0);memset(fir,0,sizeof(fir));cnt=0;for(i=1;i<=pbccnt;i++)for(j=0,k=pbc[i].size();j<k;j++)adde(n+i,pbc[i][j]);dfs1(1);top[1]=1;dfs2(1);for(i=1;i<=Q;i++){u=gi();v=gi();sum[u]++;sum[v]++;int lca=LCA(u,v);sum[fa[lca]]--;sum[lca]--;}solve(1);for(i=1;i<=n;i++)printf("%d\n",sum[i]);
}

BZOJ3331 [BeiJing2013]压力 广义圆方树相关推荐

  1. [学习笔记]圆方树广义圆方树

    引入 偶尔,我们会遇到一些要在无向图/仙人掌上做的问题,这些问题如果在树上就会比较方便,那么我们就开始考虑能不能把原图等效成一棵树,然后就可以方便地乱搞了? 圆方树就是一种将无向图/仙人掌变成树的数据 ...

  2. 广义圆方树+树链剖分+set(Codeforces Round #278 (Div. 1): E. Tourists)

    前置:双联通分量.圆方树.树链剖分 什是是广义圆方树 圆方树是针对于仙人掌建树,而广义圆方树是针对无向图建树,对于一个无向图 无向图中的所有点 → 广义圆方树中的所有圆点 无向图中的一个双联通分量 → ...

  3. 道路相遇【一般图的圆方树-广义圆方树】

    题目链接 刚开始拿到这道题的时候,先写了Tarjan缩点构树,没过样例,但是先把40分拿到了. 然后再想,就如同样例给出的那样,我们所定义的原点和方点,实际上在Tarjan直接缩点上并不能起到直接体现 ...

  4. 点双联通分量,圆方树和广义圆方树

    点双联通分量 边双联通分量想必看这篇博客的同学就会,并且边双联通分量理解和打起来比较简单,就不再赘述了. 点双联通分量,类比边双的定义,它是原图的极大无向子图,满足删去子图中任意一个节点以及与其相邻的 ...

  5. Fantasia 【HDU - 5739】【广义圆方树】

    题目链接 这道题的题意在这里就不展开了,因为这次的英文比较的好读,也没有生词,好懂一些些hh. 然后,这道题的关键点,肯定就是来看这个点是不是一个割点,也就是割去这个点之后就将原来的联通块展开成两个以 ...

  6. 【知识小结】圆方树 广义圆方树

    关于仙人掌的总结 immortalCO的博客 yyb的博客 模板 namespace T{vector <int> e[maxn * 2];int tag[maxn * 2];void a ...

  7. P4494-[HAOI2018]反色游戏【圆方树】

    正题 题目链接:https://www.luogu.com.cn/problem/P4494 题目大意 给出nnn个点mmm条边的一张无向图,节点有0/10/10/1,每条边可以选择是否取反两边的点. ...

  8. P5236 【模板】静态仙人掌(仙人掌圆方树)

    无向仙人掌图 一般需要重构成 仙人掌有向树 然后我们 就考虑 圆点的 方点的不同讨论 这个题是查询两点间最短路 如果lca 是圆点 那么就是 d[a]+d[b]-2*d[lca] 如果是方点 我们需要 ...

  9. 仙人掌问题(圆方树)

    [算法简介] 仙人掌就是把树上多连了一些返祖边,构成了一些环 根据仙人掌这个名字我们也可以较为形象的感受到图的形态 具体的,仙人掌分为点仙人掌和边仙人掌,定义分别为点/边最多属于一个环 之所以把这样的 ...

最新文章

  1. 基于Hadoop的MapReduce框架研究报告
  2. 整理一套pandas详细教程,希望对你有帮助!
  3. 功能自动化测试工具列表大全
  4. Shell 编程进阶笔记
  5. ProE二次开发之VS2005+ProE Wildfire 4.0开发环境配置
  6. [自己动手]让Editplus更好用
  7. IT英语2-编程词汇编程英语词汇
  8. java中使用几率_Java中使用蒙特卡洛算法计算德州扑克成牌概率(二)- 计算牌面分值...
  9. C语言实现x的n次方
  10. 使用find命令查找文件
  11. UsernamePasswordAuthenticationFilter源码分析
  12. PostgreSQL条件表达式 case when then end
  13. 华为带动涨价?二季度中国市场智能手机均价涨了13%
  14. 申请google Map api key for android
  15. node.js 爬取腾讯地图API全国行政区数据
  16. HTTP代理如何使用
  17. 神奇的 Magisk
  18. python excel 设置行高与列宽
  19. (蓝图)虚幻4重制俄罗斯方块(四)移动方块
  20. IllegalStateException: For MAC signing you do not need to specify the verifier key separately异常解决

热门文章

  1. 如何修改注册表的默认安装路径
  2. 1.4 19:简单计算器
  3. Java助农水果平台_助农-创业项目 | 投缘帮官方网站
  4. 牛客小白月赛28 G.牛牛和字符串的日常
  5. 老王全面Linux入门教程
  6. css !important 用法
  7. 软件成本估算之快速功能点方法应用示例
  8. EF CORE 7 中的新功能:使用 ExecuteDelete 和 ExecuteUpdate 进行批量操作
  9. python 求扇形面积
  10. ZBrush:设置参考图