题目

给一个\(n\)个点\(m\)条边的无向连通图,\(Q\)次往图中加边,每次加边后问图中的桥有多少个。(加边后边留着)。

\(n\le 10^5,m\le 2\times 10^5,Q\le 10^5\)。

分析

容易发现一条边为桥当且仅当它不在任意一个环中。

于是我们对最开始的图先得到它的生成树,然后把剩下的边加进去,加边的时候把树上两点路径上的点都标记为不是桥。每次询问的时候一样操作。这个东西可以方便地用树链剖分和线段树维护。

时间复杂度为\(O((m-n+Q)\log ^2n)\)。

代码

#include<cstdio>
#include<cctype>
#include<cstring>
#include<algorithm>
#define M(x) memset(x,0,sizeof x)
using namespace std;
int read() {
int x=0,f=1;
char c=getchar();
for (;!isdigit(c);c=getchar()) if (c=='-') f=-1;
for (;isdigit(c);c=getchar()) x=x*10+c-'0';
return x*f;
}
const int maxn=1e5+1;
const int maxj=17;
const int maxm=2e5+1;
typedef pair<int,int> Pair;
Pair bian[maxm];
int n,m;
namespace uns {
int f[maxn];
void clear(int n) {for (int i=1;i<=n;++i) f[i]=i;}
int find(int x) {return f[x]==x?x:f[x]=find(f[x]);}
}
namespace sgt {
int t[maxn<<2];
bool clr[maxn<<2];
void init(int x,int l,int r) {
clr[x]=false;
if (l==r) {
t[x]=(l!=1);
return;
}
int mid=(l+r)>>1;
init(x<<1,l,mid),init(x<<1|1,mid+1,r);
t[x]=t[x<<1]+t[x<<1|1];
}
void pushdown(int x) {
if (!clr[x]) return;
t[x<<1]=t[x<<1|1]=0;
clr[x<<1]=clr[x<<1|1]=true;
clr[x]=false;
}
void clear(int x,int L,int R,int l,int r) {
if (L==l && R==r) {
t[x]=0;
clr[x]=true;
return;
}
pushdown(x);
int mid=(L+R)>>1;
if (r<=mid) clear(x<<1,L,mid,l,r); else
if (l>mid) clear(x<<1|1,mid+1,R,l,r); else
clear(x<<1,L,mid,l,mid),clear(x<<1|1,mid+1,R,mid+1,r);
t[x]=t[x<<1]+t[x<<1|1];
}
void clear(int l,int r) {
clear(1,1,n,l,r);
}
}
namespace tree {
vector<int> g[maxn];
int f[maxn][maxj],dep[maxn],size[maxn],top[maxn],son[maxn];
int first[maxn],second[maxn],dfx;
void add(int x,int y) {g[x].push_back(y);}
void clear(int n) {
M(f),M(dep),M(size),M(top),M(son),M(first),M(second),dfx=0;
for (int i=1;i<=n;++i) g[i].clear();
}
int dfs(int x,int fa) {
f[x][0]=fa;
dep[x]=dep[fa]+1;
int &sz=size[x]=1,&sn=son[x]=0;
for (int v:g[x]) if (v!=fa) {
sz+=dfs(v,x);
if (size[v]>size[sn]) sn=v;
}
}
void Top(int x,int fa,int tp) {
first[x]=++dfx;
top[x]=tp;
if (son[x]) Top(son[x],x,tp);
for (int v:g[x]) if (v!=son[x] && v!=fa) Top(v,x,v);
second[x]=dfx;
}
void run() {
for (int j=1;j<maxj;++j) for (int i=1;i<=n;++i) f[i][j]=f[f[i][j-1]][j-1];
}
int lca(int x,int y) {
if (dep[x]<dep[y]) swap(x,y);
for (int j=maxj-1;j>=0;--j) if (dep[f[x][j]]>=dep[y]) x=f[x][j];
if (x==y) return x;
for (int j=maxj-1;j>=0;--j) if (f[x][j]!=f[y][j]) x=f[x][j],y=f[y][j];
return f[x][0];
}
void work(int x,int l) {
for (int y=top[x];dep[y]>dep[l];y=top[x=f[y][0]]) {
sgt::clear(first[y],first[x]);
}
if (dep[x]>dep[l]) sgt::clear(first[l]+1,first[x]);
}
int deal(int x,int y) {
if (dep[x]>dep[y]) swap(x,y);
int l=lca(x,y);
x==l?work(y,x):work(x,l),work(y,l);
return sgt::t[1];
}
}
int main() {
#ifndef ONLINE_JUDGE
freopen("test.in","r",stdin);
#endif
int cases=0;
while (true) {
n=read(),m=read();
if (!n && !m) break;
printf("Case %d:\n",++cases);
int wat=0;
uns::clear(n);
tree::clear(n);
for (int i=1;i<=m;++i) {
int x=read(),y=read();
int fx=uns::find(x),fy=uns::find(y);
if (fx!=fy) tree::add(x,y),tree::add(y,x),uns::f[fx]=fy; else bian[++wat]=make_pair(x,y);
}
tree::dfs(1,1);
tree::Top(1,1,1);
tree::run();
sgt::init(1,1,n);
for (int i=1;i<=wat;++i) {
int x=bian[i].first,y=bian[i].second;
tree::deal(x,y);
}
int q=read();
while (q--) {
int x=read(),y=read();
int ans=tree::deal(x,y);
printf("%d\n",ans);
}
puts("");
}
return 0;
}

HDU2460-Network的更多相关文章

  1. [hdu2460]network(依次连边并询问图中割边数量) tarjan边双联通分量+lca

    题意: 给定一个n个点m条边的无向图,q个操作,每个操作给(x,y)连边并询问此时图中的割边有多少条.(连上的边会一直存在) n<=1e5,m<=2*10^5,q<=1e3,多组数据 ...

  2. Tarjan求割点和桥

    by szTom 前置知识 邻接表存储及遍历图 tarjan求强连通分量 割点 割点的定义 在一个无向图中,如果有一个顶点集合,删除这个顶点集合以及这个集合中所有顶点相关联的边以后,图的连通分量增多, ...

  3. Recurrent Neural Network系列1--RNN(循环神经网络)概述

    作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明.谢谢! 本文翻译自 RECURRENT NEURAL NETWORKS T ...

  4. 创建 OVS flat network - 每天5分钟玩转 OpenStack(134)

    上一节完成了 flat 的配置工作,今天创建 OVS flat network.Admin -> Networks,点击 "Create Network" 按钮. 显示创建页 ...

  5. 在 ML2 中配置 OVS flat network - 每天5分钟玩转 OpenStack(133)

    前面讨论了 OVS local network,今天开始学习 flat network. flat network 是不带 tag 的网络,宿主机的物理网卡通过网桥与 flat network 连接, ...

  6. OVS local network 连通性分析 - 每天5分钟玩转 OpenStack(132)

    前面已经创建了两个 OVS local network,今天详细分析它们之间的连通性. launch 新的 instance "cirros-vm3",网络选择 second_lo ...

  7. 再部署一个 instance 和 Local Network - 每天5分钟玩转 OpenStack(131)

    上一节部署了 cirros-vm1 到 first_local_net,今天我们将再部署 cirros-vm2 到同一网络,并创建 second_local_net. 连接第二个 instance 到 ...

  8. 创建 OVS Local Network - 每天5分钟玩转 OpenStack(129)

    上一节我们完成了 OVS 的准备工作,本节从最基础的 local network 开始学习.local network 不会与宿主机的任何物理网卡连接,流量只被限制在宿主机内,同时也不关联任何的 VL ...

  9. Configure a bridged network interface for KVM using RHEL 5.4 or later?

    environment Red Hat Enterprise Linux 5.4 or later Red Hat Enterprise Linux 6.0 or later KVM virtual ...

  10. BZOJ 1146: [CTSC2008]网络管理Network [树上带修改主席树]

    1146: [CTSC2008]网络管理Network Time Limit: 50 Sec  Memory Limit: 162 MBSubmit: 3522  Solved: 1041[Submi ...

随机推荐

  1. 20155307 《Java程序设计》课堂实践项目数据库

    老师我上课没有在规定时间内完成,这是我补交的截图

  2. 20155307 2016-2017 《Java程序设计》第三次实验报告

    (一)敏捷开发与XP 敏捷开发是一种以人为核心.迭代.循序渐进的开发方法."敏捷流程"是一系列价值观和方法论的集合.从2001年开始,一些软件界的专家开始倡导"敏捷&qu ...

  3. day1 ORM

    ORM对象关系映射 映射关系: 表名 <-------> 类名 字段 <-------> 属性 表记录 <------->类实例对象 class Customer( ...

  4. Zabbix学习之路(十)之分布式监控zabbix_proxy及交换机监控

    1.Zabbix分布式监控 zabbix proxy 可以代替 zabbix server 检索客户端的数据,然后把数据汇报给 zabbix server,并且在一定程度上分担了zabbix serv ...

  5. 可能是全网首个支持阿里云Elasticsearch Xapck鉴权的Skywalking

    可能是全网首个支持阿里云Elasticsearch Xapck鉴权的Skywalking 对Skywalking有兴趣的同学参见:年轻人的第一个APM-Skywalking 之前在搭建Skywalki ...

  6. R的数据读写

    目录 1 简介 在使用任何一款数据分析软件的时候,首先要做的就是数据成功的读写问题,所以不同于其他文档的书写方法,本文将探讨如何读写本地文本文件. 2 运行环境 操作系统:Win10 R版本:R-3. ...

  7. C语言的函数调用过程(栈帧的创建与销毁)

    从汇编的角度解析函数调用过程 看看下面这个简单函数的调用过程: int Add(int x,int y) { ; sum = x + y; return sum; } int main () { ; ...

  8. vue route.go 载入刷新

    vue route 重新载入刷新: this.$router.go({path : 'path' , query: { param: this.param} })

  9. 列出连通集(mooc)

    给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集.假设顶点从0到N−1编号.进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点. 输入格式: 输入第1 ...

  10. 3.5星|《算法霸权》:AI、算法、大数据在美国的阴暗面

    算法霸权 作者在华尔街对冲基金德绍集团担任过金融工程师,后来去银行做过风险分析,再后来去做旅游网站的用户分析.后来辞职专门揭露美国社会生活背后的各种算法的阴暗面. 书中提到的算法的技术缺陷,我归纳为两 ...