题目

给一个\(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. 你真的认为iphone只是一部手机么

    闲言不表,直奔主题.我是一个程序员,上周参加了一个开源软件交流大会,其实会上并没有听到什么新鲜的东西.但是在会中,偶然间听到了一个关于iphone的秘密,却着实令我震惊了,事情具体是这样的,听我慢慢道 ...

  2. SupperSocket深入浅出(一)

    花了几天时间了解了SupperSocket工作原理,各各类之间的工作关系.SupperSocket大部资料网上都有,但写的都不适合初学者. 今天花点时间写下这几天的学习成果,一方面是为了将来更好的回顾 ...

  3. XAMPP设置tomcat自启动时,报无效的Win32程序

    最近给一个客户开发了一套系统,需要在内网中部署.系统是Java + Tomcat7 + mysql开发的. 考虑到客户内网不能上网的情况下,想使用XAMPP的便捷性,给客户进行部署.因为只需要Tomc ...

  4. 【SQLSERVER】索引的维护优化

    一.索引的利弊   优点: 1.大大加快数据的检索速度: 2.创建唯一性索引,保证数据库表中每一行数据的唯一性: 3.加速表和表之间的连接: 4.在使用分组和排序子句进行数据检索时,可以显著减少查询中 ...

  5. Session丢失——解决方案

    先抄下别人的作业(原帖:http://www.cnblogs.com/zhc088/archive/2011/07/24/2115497.html) Session丢失已经是一种习以为常的问题了,在自 ...

  6. 搜索引擎Solr6.2.1 索引富文本(word/pdf/txt/html)

    一:首先建立Core 在core下面新建lib文件夹,存放相关的jar包,如图所示: lib文件夹打开所示,这些类库在solr6.2.1解压之后都能找到: 修改solrconfig.xml,把刚刚建的 ...

  7. oss上传文件0字节

    最近使用oss上传文件,不同项目中使用的版本也不同,之前的都能正常上传,最近因需要添加ObjectMetaData属性,扩展了一个方法,发现上传的文件始终是0字节的,最终跟源码发现conntentLe ...

  8. Qt 利用XML文档,写一个程序集合 二

    接上一篇文章https://www.cnblogs.com/DreamDog/p/9213915.html XML文档的读写 一个根节点,下面每一个子节点代表一个子程序,内容为子程序名字,图标路径,e ...

  9. Python range() 函数用法

    函数语法 range(start, stop[, step]) 参数说明: start: 计数从 start 开始.默认是从 0 开始.例如range(5)等价于range(0, 5); stop: ...

  10. Eclipse用java.util.Scanner时出现Resource leak: 'in' is never closed

    Resource leak: 'in' is never closed : 直译为资源泄漏,‘in’一直没被关闭. 由于声明了数据输入扫描仪(Scanner in),从而获得了配置内存,但是结束时却没 ...