POJ3694 Network
题意: 给出一个无向连通图,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相关推荐
- 图论复习——dfs树,点双,边双,强连通分量
知识点 dfs树 对一个图运行 dfs 算法,每个点uuu的父亲定义为第一次遍历uuu时的前驱结点,若无则为根. 无向图的 dfs树 没有横叉边. 有向图的 dfs树 横叉边方向唯一,总是从后访问的点 ...
- 双连通分量(点-双连通分量边-双连通分量)
概念: 双连通分量有点双连通分量和边双连通分量两种.若一个无向图中的去掉任意一个节点(一条边)都不会改变此图的连通性,即不存在割点(桥),则称作点(边)双连通图. 一个无向图中的每一个极大点(边)双连 ...
- Network POJ-3694
Network POJ-3694 文章目录 Description 题意: 样例分析: 题解: 代码: Description A network administrator manages a la ...
- Distilling the Knowledge in a Neural Network 论文笔记蒸馏
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/bryant_meng/article/ ...
- CentOS7 service network start命令启动时报错解决方法
service network start命令启动时报错: [root@localhost network-scripts]# service network start Starting netwo ...
- 面向Mobile device的CNN模型手工设计与NAS分析总结,MobileNet V1,V2,V3,Efficient,MNasNet以及Efficient network design
手工方法和NAS的高效网络模型设计总结与分析 这篇文章主要关注对于移动端,资源受限平台的高效神经网络设计(Manually)和搜索(NAS). 高效的CNN设计不只是用在服务器,云端,资源 ...
- 基于caffe的度量学习实现(Siamese network Triplet network)
基于caffe的度量学习实现,主要是孪生网络和三元组网络(Siamese network & Triplet network)实现图像的分类和度量. 包含数据集制作脚本,训练测试脚本和pyth ...
- Corner Proposal Network 论文阅读(2020ECCV)
Introduction 引言 介绍了anchor base 和 anchor free 与one stage 和 two stage ,然后说通常认为的anchor base 有低召回的问题,anc ...
- 创建第一个 local network(I) - 每天5分钟玩转 OpenStack(80)
在 ML2 配置文件中 enable local network 后,本节将开始创建第一个 local network. 我们将通过 Web GUI 创建第一个 local network. 首先确保 ...
最新文章
- 算法工程师必知必会10大基础算法!
- 庖丁解牛TLD(二)——初始化工作(为算法的准备)
- 图片中的Build 2016
- VEGA:诺亚AutoML高性能开源算法集简介
- java 高德地图 车型比价计算_高德地图的高速公路过路费计算功能是如何实现的?有相应开放的API吗?...
- 售价16999元!心系天下三星W22 5G耀世发布
- [在今天的历史]他们终于要对我下毒手了
- jQuery - 自定义插件开发方式
- 量子计算机具有天然的处理能力,新发现:光纤可用于构建具有强大计算与处理能力的超导量子计算机...
- oracle数据库双机热备原理,oracle数据库双机热备方案
- Diamond/Quartus 工具的bug
- 《麻省理工公开课:线性代数》中文笔记来了!
- 存储基础知识--存储网络
- java 文本提取_Java 提取PDF 文本内容
- ERP系统实施之入门
- 什么是MIMO(多输入多输出),以及MIMO的分类和测试(一)
- 使用html语言替换字符串中的特殊标点符号
- 解决Chrome浏览器变慢
- STM32在线烧录程序的开发
- 淘宝订单详情(插旗)API操作 API 返回值说明
热门文章
- driver.class.php line: 109,thinkphp3.2.3 无法加载数据库驱动: Think\Db\Driver\
- java最好的开发工具_IntelliJ IDEA Ultimate Edition 2018 最好的 Java 开发工具
- appium java版本错误_java – 无法创建新会话. appium代码中的错误
- 《系统集成项目管理工程师》必背100个知识点-94我国信息化战略目标
- Mysql在离线安装时提示:error: Found option without preceding group in config file
- AndroidStudio中调试时一直显示waiting for debugger
- Vue中使用vue-croper插件实现图片上传裁剪并传到SpringBoot后台接口
- 若依前后端分离版怎样修改主页面显示请求的SpringBoot后台数据
- Java中使用Jedis连接Redis数据库流程
- C#中在定义事件委托时怎样跨窗体传递参数