题目大意:给定一个 N 个点,M 条边的无向图,支持 Q 次操作,每次可以向该无向图中加入一条边,并需要回答当前无向图中桥的个数。

题解:(暴力:Q 次 Tarjan)

先进行一次 Tarjan 求出当前图中桥的个数,并求出边双联通分量,缩点之后所有的边双联通分量构成一棵树。考虑每次向该无向图中加边的情况,若新加入的边的端点在同一个边双联通分量中时,不会对现有的桥产生影响;若新加入边的端点在位于两个不同的双联通分量中,则对应于缩点之后的树来说,在树上的两个节点之间添加了一条边,这会导致两个节点之间的简单路径上的所有边构成的桥均失效,即:从答案中减去树上两点之间边的个数即可。若每次暴力上跳计算答案贡献,时间复杂度比较高,在这里采用并查集进行优化,即:每次上跳时,将当前节点合并到其父节点的集合中,可以使得下一次修改时,避免重复经过同样的路径。

代码如下

#include <cstdio>
#include <algorithm>
#include <memory.h>
using namespace std;
const int maxv=1e5+10;
const int maxe=2e5+10; int T;
struct node{
int nxt,to;
node(int x=0,int y=0):nxt(x),to(y){}
}e[maxe<<1];
int tot=1,head[maxv];
inline void add_edge(int from,int to){
e[++tot]=node(head[from],to),head[from]=tot;
} int n,m,q;
int dfs_clk,low[maxv],dfn[maxv],dcc,cor[maxv];
bool bridge[maxe<<1]; void read_and_parse(){
for(int i=1,x,y;i<=m;i++){
scanf("%d%d",&x,&y);
add_edge(x,y),add_edge(y,x);
}
} void tarjan(int u,int fe){
low[u]=dfn[u]=++dfs_clk;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(!dfn[v]){
tarjan(v,i);
low[u]=min(low[u],low[v]);
if(low[v]>dfn[u])bridge[i]=bridge[i^1]=1;
}
else if(i!=(fe^1))low[u]=min(low[u],dfn[v]);
}
} void dfs(int u){
cor[u]=dcc;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(bridge[i]||cor[v])continue;
dfs(v);
}
} vector<int> G[maxv];
int dep[maxv],f[maxv][20]; void dfs(int u,int fa){
for(int i=1;i<=18;i++)f[u][i]=f[f[u][i-1]][i-1];
for(int i=0;i<G[u].size();i++){
int v=G[u][i];
if(v==fa)continue;
dep[v]=dep[u]+1,f[v][0]=u;
dfs(v,u);
}
}
int lca(int x,int y){
if(dep[x]<dep[y])swap(x,y);
for(int i=18;~i;i--)if(dep[f[x][i]]>=dep[y])x=f[x][i];
if(x==y)return x;
for(int i=18;~i;i--)if(f[x][i]!=f[y][i])x=f[x][i],y=f[y][i];
return f[x][0];
} int fa[maxv];
int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);} void solve(){
for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i,0);
for(int i=1;i<=n;i++)if(!cor[i])++dcc,dfs(i);
for(int i=1;i<=tot;i++){
int x=e[i].to,y=e[i^1].to;
if(cor[x]==cor[y])continue;
G[cor[x]].push_back(cor[y]);
}
dfs(1,0);
int ans=dcc-1;
for(int i=1;i<=dcc;i++)fa[i]=i;
printf("Case %d:\n", ++T);
scanf("%d",&q);
while(q--){
int x,y;
scanf("%d%d",&x,&y);
x=cor[x],y=cor[y];
int p=lca(x,y);
x=find(x);
while(dep[x]>dep[p]){
fa[x]=f[x][0];
--ans;
x=find(x);
}
y=find(y);
while(dep[y]>dep[p]){
fa[y]=f[y][0];
--ans;
y=find(y);
}
printf("%d\n",ans);
}
puts("");
} void init(){
for(int i=1;i<=n;i++)dfn[i]=low[i]=dep[i]=cor[i]=head[i]=0;
for(int i=1;i<=2*m+1;i++)bridge[i]=0;
for(int i=1;i<=n;i++)G[i].clear();
dcc=dfs_clk=0,tot=1;
} int main(){
while(scanf("%d%d",&n,&m)&&n){
init();
read_and_parse();
solve();
}
return 0;
}

【POJ3694】Network的更多相关文章

  1. 【BZOJ】【1834】【ZJOI2010】Network 网络扩容

    网络流/费用流 这题……我一开始sb了. 第一问简单的最大流…… 第二问是要建费用流的图的……但是是在第一问的最大流跑完以后的残量网络上建,而不是重建…… 我们令残量网络上原有的弧的费用全部为0(因为 ...

  2. 【树形贪心】【UVA1267】Network

    重要意义:复习好久没写的邻接表了. Network, Seoul 2007, LA3902 Consider a tree network with n nodes where the interna ...

  3. 【OpenStack】network相关知识学习

    network 类型 local:通信不跨主机,必须同一网段,主要做单机测试使用: flat:统计可以跨主机,但是需要在同一网段: 每个 flat network 都会独占一个物理网卡 计算节点上 b ...

  4. 【转】[Network] 计算机网络基础知识总结

    阅读目录 1. 网络层次划分 2. OSI七层网络模型 3. IP地址 4. 子网掩码及网络划分 5. ARP/RARP协议 6. 路由选择协议 7. TCP/IP协议 8. UDP协议 9. DNS ...

  5. 【图论】Network of Schools

    [POJ1236]Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 18969   Acc ...

  6. 【leetcode】Network Delay Time

    题目: There are N network nodes, labelled 1 to N. Given times, a list of travel times as directed edge ...

  7. BZOJ 1834 【ZJOI2010】 network 网络扩容

    Description 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用.求: 1. 在不扩容的情况下,1到N的最大流: 2. 将1到N的最大流增加K所需的 ...

  8. 【BZOJ3732】 Network Kruskal+倍增lca

    Description 给你N个点的无向图 (1 <= N <= 15,000),记为:1…N. 图中有M条边 (1 <= M <= 30,000) ,第j条边的长度为: d_ ...

  9. 【poj1236】 Network of Schools

    http://poj.org/problem?id=1236 (题目链接) 题意 给定一个有向图,求:1.至少要选几个顶点,才能做到从这些顶点出发,可以到达全部顶点:2.至少要加多少条边,才能使得从任 ...

随机推荐

  1. jenkins 构建后发送钉钉消息通知(插件)

    钉钉,越来越多的公司采用,那么我们在持续集成中,也可以直接选择钉钉插件的,在之前的博客中 ,对发送的钉钉消息进行了定制,那样的话会开启一个新的任务, 其实今天呢,我们可以直接安装一个插件就可以发送了, ...

  2. 【下一代核心技术DevOps】:(四)私有镜像库阿里云Docker服务使用

    1.使用阿里云镜像库有很多优点 稳定可靠,阿里技术,放心使用. 国内cdn多节点加速,下载速度非常快 可以和阿里云Git代码集成,不需要第三方CI工具,当然带的自动构建服务也可以和其他的Git库集成, ...

  3. CAD2020下载安装AutoCAD2020中文版下载地址+安装教程

    AutoCAD2020中文版为目前最新软件版本,我第一时间拿到软件进行安装测试,确保软件正常安装且各项功能正常可以使用,立刻拿出来分享,想用最新版本的话,抓紧下载使用吧: 我把我用的安装包贡献给你下载 ...

  4. Centos下安装破解confluence6.3的操作记录

    confluence是一个专业的企业知识管理与协同软件,可以用于构建企业wiki.通过它可以实现团队成员之间的协作和知识共享.现在大多数公司都会部署一套confluence,用作内部wiki.现在co ...

  5. 11.18 Daily Scrum

    这两天开发人员陆续提交了自己开发的部分. 目前所有开发任务都已经完成,剩下的只是测试和整合,做最后的冲刺. 明天的任务: 李承晗:测试与整合

  6. BUAAMOOC项目M2 postmortem

    设想和目标 1.我们的软件要解决什么问题?是否定义的很清楚?是否对典型用户和典型场景有清晰的描述? 我们的软件是基于北航MOOC网站做的Android手机客户端,用于便捷的在学校里通过手机做到随时随地 ...

  7. jdk自带的jvisualvm-监控远程linux

    简介 jdk有好多自带的工具比如jconsole.jvisualvm.jstatd等 Windows的路径:%JAVA_HOME/bin/目录下,配置好环境变量直接用cmd执行jvisualvm命令即 ...

  8. ajax跨域请求数据

    最近开始接触ajax的跨域请求问题,相比网上说的一大堆,我这里就说得比较浅显了. 关于为什么要跨域这个问题,实际的需求是当网站项目部署在一个域名上的时候,分域可以很好地解决网站卡顿问题(拥有多台服务器 ...

  9. docker 构建dockerfile

    版本为: 使用cenotos 7 docker  版本 [root@zhao ~]# docker --versionDocker version 17.03.1-ce, build c6d412e ...

  10. php 中instanceof的使用

    转载:https://www.cnblogs.com/tengjian/p/7999107.html 作用:(1)判断一个对象是否是某个类的实例,(2)判断一个对象是否实现了某个接口. 第一种用法: ...