BZOJ3331压力
码量略大。
题意就是求路径必经点。
tarjan缩点,所有的非割点只有是起点终点时才必经,直接开个ans数组就OK了。
至于割点,因为缩完点之后的图是vDcc和割点共同组成的,而且题目说连通,那就是棵树,直接树上差分,最后统计信息,输出时输出割点的val即可。
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<set>
#include<map>
using namespace std;
int read(){
int sum=,f=;char x=getchar();
while(x<''||x>''){
if(x=='-') f=-;
x=getchar();
}while(x>=''&&x<=''){
sum=sum*+x-'';
x=getchar();
}return sum*f;
}
struct EDGE{
int ed,nex;
}edge[],edgec[];
int num,numc,first[],firstc[];
int n,m,ques,nvcn;
int dfn[],low[],sta[],bl[],new_id[];
int ord,vccnum,top,ans[],val[],d[];
int f[][];
vector<int>vcc[];
bool cut[],v[];
void add(int st,int ed){
// cout<<"st="<<st<<" ed="<<ed<<endl;
edge[++num].ed=ed;
edge[num].nex=first[st];
first[st]=num;
}
void addc(int st,int ed){
// cout<<"stc="<<st<<" edc="<<ed<<endl;
edgec[++numc].ed=ed;
edgec[numc].nex=firstc[st];
firstc[st]=numc;
}
void tarjan(int x){
dfn[x]=low[x]=++ord;
sta[++top]=x;
int child=;
for(int i=first[x];i;i=edge[i].nex){
int y=edge[i].ed;
if(!dfn[y]){
tarjan(y);
low[x]=min(low[x],low[y]);
if(low[y]>=dfn[x]){
child++;
if((x==&&child>=)||(x!=&&child>)) cut[x]=;
vcc[++vccnum].push_back(x);
int p;
do{
p=sta[top--];
vcc[vccnum].push_back(p);
}while(p!=y);
}
}else low[x]=min(low[x],dfn[y]);
}
}
void bfs(int st){
queue<int>q;
d[st]=;
q.push(st);
while(!q.empty()){
int x=q.front();q.pop();
for(int i=firstc[x];i;i=edgec[i].nex){
int y=edgec[i].ed;
if(d[y]) continue;
d[y]=d[x]+;
f[y][]=x;
q.push(y);
for(int j=;j<=;j++)
f[y][j]=f[f[y][j-]][j-];
}
}
}
int lca(int x,int y){
if(d[x]>d[y]) swap(x,y);
for(int i=;i>=;i--)
if(d[f[y][i]]>=d[x])
y=f[y][i];
if(x==y) return x;
for(int i=;i>=;i--)
if(f[x][i]!=f[y][i]){
x=f[x][i];
y=f[y][i];
}
return f[x][];
}
void dfs(int x){
v[x]=;
for(int i=firstc[x];i;i=edgec[i].nex){
int y=edgec[i].ed;
if(v[y]) continue;
dfs(y);
val[x]+=val[y];
}
}
int main(){
// freopen("b.in","r",stdin);
// freopen("b1.in","r",stdin);
n=read();m=read();ques=read();
for(int i=,x,y;i<=m;i++){
x=read();y=read();
add(x,y);add(y,x);
}
tarjan();
nvcn=vccnum;
for(int i=;i<=n;i++)
if(cut[i]) new_id[i]=++nvcn;
for(int i=;i<=vccnum;i++)
for(int j=;j<vcc[i].size();j++){
int x=vcc[i][j];
if(cut[x]){
addc(new_id[x],i);
addc(i,new_id[x]);
}else bl[x]=i;
}
bfs();
for(int i=,a,b;i<=ques;i++){
a=read();b=read();
ans[a]++;ans[b]++;
if(cut[a]) a=new_id[a];
else a=bl[a];
if(cut[b]) b=new_id[b];
else b=bl[b];
int LCA=lca(a,b);
val[a]++;val[b]++;val[LCA]--;val[f[LCA][]]--;
}
dfs();
for(int i=;i<=n;i++){
if(cut[i])
printf("%d\n",val[new_id[i]]);
else printf("%d\n",ans[i]);
}return ;
}
BZOJ3331压力的更多相关文章
- bzoj3331 压力(圆方树)
题目链接 圆方树 圆方树就是对于联通无向图中的每一个点双新建一个方点,与点双中的每个点连一条边,然后将原来的边删去.将原来的点看作圆点,新建的点看作方点.所以叫做圆方树. 性质 1.圆方树肯定是棵树( ...
- BZOJ3331 压力 (圆方树+树上差分)
题意 略 题解 求路径上的割点. 然后就直接圆方树上差分 CODE #include <bits/stdc++.h> using namespace std; inline void rd ...
- 仙人掌&圆方树
仙人掌&圆方树 Tags:图论 [x] [luogu4320]道路相遇 https://www.luogu.org/problemnew/show/P4320 [ ] [SDOI2018]战略 ...
- 【BZOJ3331】[BeiJing2013]压力 Tarjan求点双
[BZOJ3331][BeiJing2013]压力 Description 如今,路由器和交换机构建起了互联网的骨架.处在互联网的骨干位置的核心路由器典型的要处理100Gbit/s的网络流量.他们每天 ...
- BZOJ3331: [BeiJing2013]压力
传送门 Tarjan的三大应用之一:求解点双联通分量. 求解点双联通分量.然后缩点,差分优化即可. //BZOJ 3331 //by Cydiater //2016.10.29 #include &l ...
- BZOJ3331 [BeiJing2013]压力[圆方树+树上差分]
圆方树新技能get.具体笔记见图连通性问题学习笔记. 这题求无向图的必经点,这个是一个固定套路:首先,一张连通的无向图中,每对点双和点双之间是以一个且仅一个割点连接起来的(如果超过一个就不能是割点了) ...
- BZOJ3331 BZOJ2013 压力
考前挣扎 圆方树这么早就出现了嘛... 要求每个点必须被经过的次数 所以就是路径上的割点/端点++ 由于圆方树上所有非叶子圆点都是割点 所以就是树上差分就可以辣. 实现的时候出了一点小问题. 就是这里 ...
- 使用SwingBench 对Oracle RAC DB性能 压力测试
我们可以使用swingbench这个工具对数据库性能进行压力测试,得到一些性能指标作为参考. SwingBench下载: http://www.dominicgiles.com/downloads.h ...
- [原]一个针对LVS的压力测试报告
LVS 测试报告 测试计划 基本功能测试 流量压力测试 响应时间测试 配置正确性测试 灾难恢复测试 测试点 基本功能测试 客户端IP地址正确性 RealServer 访问Internet测试(包括Ip ...
随机推荐
- Linux Permission denied 问题
Linux Permission denied 问题 来源 https://www.cnblogs.com/sparkdev/p/10287164.html 如果当前用户没有某个文件的写权限,又要通 ...
- spring-test跟junit结合单元测试获取ApplicationContext实例的方法
步骤 1.继承AbstractJUnit4SpringContextTests 2.引入ApplicationContext 示例代码:(可以根据name或者类型获取bean) import or ...
- Oracle学习笔记:一个简单的行转列例子
一个简单的行列转换例子,原始数据. create table temp_cwh_student ( name ), subject ), score ) ) select * from temp_cw ...
- 使用javascript和jquery获取类方法
1.本质区别 jquery是一个javascript库.jquery是一个基于javascript语言的框架,本质上就是javascript. 2.代码编写的差异 jquery大大简化了JavaScr ...
- MySQL数据库笔记二:数据类型及数据库操作
三.MySQL数据库数据类型 MySQL数据库中支持多种数据类型:数值型.字符型.日期型 常用的数据类型: 1.整型 int:整形,存储整数 int(M):M表示预期值.与存储大小和数值的范围无关. ...
- Linux工具之watch
watch watch 监测一个命令的运行结果 -n 指定间隔的时间 -d watch会高亮显示变化的区域. -t 会关闭watch命令在顶部的时间间隔, ...
- 使用cJSON解析JSON
cJSON获取数组元素的每个值 { "operType": 0x5, "field": ["time","matchRule&qu ...
- libusb_control_setup
libusb_fill_control_transfer(transfer, devh, buf, ctrl_urb_complete_cb, utrans, 1000); ...
- USRP B210 更改A通道或B通道
USRP B210 更改A通道或B通道: 默认是A通道进行发射/接收,或设置 Mb0:Subdev Spec: A:A 设置B通道进行发射/接收,设置 Mb0:Subdev Spec: A:B
- python小练手题1
1. """ Write a program which can compute the factorial of a given numbers. The result ...