题意: 给出一个无向连通图,q次增加后询问,问每次增加后剩余“桥(割边)”的数量。

思路:

先将所有的边双连通分量找到,缩点变成树,找到dcc个数,桥数即为dcc-1;

对于每个询问,若c[x]==c[y]无影响;反之,在树上找到c[x]、c[y]的LCA,再将路上的桥变为0,sum++,最后桥数减去sum。;

代码:

#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<iostream>
using namespace std;
const int N=1e5+10;
const int M=2*1e5+10;
struct node{int nxt,to;
}bian[2*M];
int head[N];
int cnt1=1;
int pre[N],nxt[2*M],to[2*M];
int cnt2=1;
int dfn[N],low[N];
int    tot,c[N];
bool bri[2*M];
int fa[N];
int num;
int dcc;
int n,m;
int f[N][30];
int dep[N];
int root;
int L;
bool exi[2*N+10];
void add(int x,int y)
{bian[++cnt1].nxt=head[x];bian[cnt1].to=y;head[x]=cnt1;
}
void add_c(int x,int y)
{nxt[++cnt2]=pre[x];to[cnt2]=y;pre[x]=cnt2;
}
void tarjan(int x,int in)
{dfn[x]=low[x]=++num;for(int i=head[x];i;i=bian[i].nxt){int y=bian[i].to;if(!dfn[y]){tarjan(y,i);low[x]=min(low[x],low[y]);if(low[y]>dfn[x]){bri[i]=bri[i^1]=true;}   }else if(i!=(in^1)){low[x]=min(low[x],dfn[y]);}}
}
void dfs(int x)
{c[x]=dcc;for(int i=head[x];i;i=bian[i].nxt){int y=bian[i].to;if(c[y]||bri[i]) continue;dfs(y);}
}
void build()
{for(int i=2;i<=cnt1;i++){int x=bian[i].to;int y=bian[i^1].to;if(c[x]==c[y]) continue;add_c(c[x],c[y]);   }
}void zbb(int x,int d,int fc)
{dep[x]=d;for(int i=pre[x];i;i=nxt[i]){int y=to[i];if(y!=fc){f[y][0]=x;fa[y]=i;exi[i]=1;zbb(y,d+1,x);}   }
}
void father()
{dep[0]=-1;dep[1]=0;for(int i=pre[1];i;i=nxt[i]){int y=to[i];f[y][0]=1;fa[y]=i;exi[i]=1;zbb(y,1,1);}for(int i=1;i<=30;i++){if((2<<i)>n){L=i-1;break;    }}for(int j=1;j<=L;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=L;j>=0;j--){if(dep[f[x][j]]>=dep[y])   x=f[x][j];}if(x==y) return x;for(int j=L;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 end)
{if(x==end) return;int bb=-5;int sum=0;while(bb!=end){bb=f[x][0];if(exi[fa[x]]){exi[fa[x]]=0;sum++;  }x=bb;}dcc-=sum;
}
void clear()
{memset(to,0,sizeof to);memset(pre,0,sizeof pre);memset(nxt,0,sizeof nxt);memset(bri,0,sizeof bri);memset(bian,0,sizeof (struct node)*2*M);memset(head,0,sizeof head);cnt1=1;cnt2=1;num=0;tot=0;dcc=0;root=1;L=0;memset(dfn,0,sizeof dfn);memset(low,0,sizeof low);memset(fa,0,sizeof fa);memset(f,0,sizeof f);memset(dep,0,sizeof dep);memset(c,0,sizeof c);memset(exi,0,sizeof exi);
}int main()
{int shu=0;while(1){scanf("%d%d",&n,&m);if(n==0&&m==0) break;shu++;clear();int x,y;for(int i=1;i<=m;i++){scanf("%d%d",&x,&y);add(x,y);add(y,x);   }tarjan(1,0);for(int i=1;i<=n;i++){if(!c[i]){dcc++;dfs(i);   }}build();father();dcc--;int q;scanf("%d",&q);bool flag=0;printf("Case %d:\n",shu);for(int k=1;k<=q;k++){scanf("%d%d",&x,&y);if(c[x]==c[y]){flag=1;   }else{int p=lca(c[x],c[y]);work(c[x],p);work(c[y],p);}printf("%d\n",dcc);}puts("");   }   return 0;
}

注意:memset要清空,dep[0]=-1;

转载于:https://www.cnblogs.com/Miracevin/p/9031484.html

POJ3694 Network相关推荐

  1. 图论复习——dfs树,点双,边双,强连通分量

    知识点 dfs树 对一个图运行 dfs 算法,每个点uuu的父亲定义为第一次遍历uuu时的前驱结点,若无则为根. 无向图的 dfs树 没有横叉边. 有向图的 dfs树 横叉边方向唯一,总是从后访问的点 ...

  2. 双连通分量(点-双连通分量边-双连通分量)

    概念: 双连通分量有点双连通分量和边双连通分量两种.若一个无向图中的去掉任意一个节点(一条边)都不会改变此图的连通性,即不存在割点(桥),则称作点(边)双连通图. 一个无向图中的每一个极大点(边)双连 ...

  3. Network POJ-3694

    Network POJ-3694 文章目录 Description 题意: 样例分析: 题解: 代码: Description A network administrator manages a la ...

  4. Distilling the Knowledge in a Neural Network 论文笔记蒸馏

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/bryant_meng/article/ ...

  5. CentOS7 service network start命令启动时报错解决方法

    service network start命令启动时报错: [root@localhost network-scripts]# service network start Starting netwo ...

  6. 面向Mobile device的CNN模型手工设计与NAS分析总结,MobileNet V1,V2,V3,Efficient,MNasNet以及Efficient network design

    手工方法和NAS的高效网络模型设计总结与分析 这篇文章主要关注对于移动端,资源受限平台的高效神经网络设计(Manually)和搜索(NAS). ​​​​​​高效的CNN设计不只是用在服务器,云端,资源 ...

  7. 基于caffe的度量学习实现(Siamese network Triplet network)

    基于caffe的度量学习实现,主要是孪生网络和三元组网络(Siamese network & Triplet network)实现图像的分类和度量. 包含数据集制作脚本,训练测试脚本和pyth ...

  8. Corner Proposal Network 论文阅读(2020ECCV)

    Introduction 引言 介绍了anchor base 和 anchor free 与one stage 和 two stage ,然后说通常认为的anchor base 有低召回的问题,anc ...

  9. 创建第一个 local network(I) - 每天5分钟玩转 OpenStack(80)

    在 ML2 配置文件中 enable local network 后,本节将开始创建第一个 local network. 我们将通过 Web GUI 创建第一个 local network. 首先确保 ...

最新文章

  1. 算法工程师必知必会10大基础算法!
  2. 庖丁解牛TLD(二)——初始化工作(为算法的准备)
  3. 图片中的Build 2016
  4. VEGA:诺亚AutoML高性能开源算法集简介
  5. java 高德地图 车型比价计算_高德地图的高速公路过路费计算功能是如何实现的?有相应开放的API吗?...
  6. 售价16999元!心系天下三星W22 5G耀世发布
  7. [在今天的历史]他们终于要对我下毒手了
  8. jQuery - 自定义插件开发方式
  9. 量子计算机具有天然的处理能力,新发现:光纤可用于构建具有强大计算与处理能力的超导量子计算机...
  10. oracle数据库双机热备原理,oracle数据库双机热备方案
  11. Diamond/Quartus 工具的bug
  12. 《麻省理工公开课:线性代数》中文笔记来了!
  13. 存储基础知识--存储网络
  14. java 文本提取_Java 提取PDF 文本内容
  15. ERP系统实施之入门
  16. 什么是MIMO(多输入多输出),以及MIMO的分类和测试(一)
  17. 使用html语言替换字符串中的特殊标点符号
  18. 解决Chrome浏览器变慢
  19. STM32在线烧录程序的开发
  20. 淘宝订单详情(插旗)API操作 API 返回值说明

热门文章

  1. driver.class.php line: 109,thinkphp3.2.3 无法加载数据库驱动: Think\Db\Driver\
  2. java最好的开发工具_IntelliJ IDEA Ultimate Edition 2018 最好的 Java 开发工具
  3. appium java版本错误_java – 无法创建新会话. appium代码中的错误
  4. 《系统集成项目管理工程师》必背100个知识点-94我国信息化战略目标
  5. Mysql在离线安装时提示:error: Found option without preceding group in config file
  6. AndroidStudio中调试时一直显示waiting for debugger
  7. Vue中使用vue-croper插件实现图片上传裁剪并传到SpringBoot后台接口
  8. 若依前后端分离版怎样修改主页面显示请求的SpringBoot后台数据
  9. Java中使用Jedis连接Redis数据库流程
  10. C#中在定义事件委托时怎样跨窗体传递参数