zoj2588-tarjan求桥/割边
tarjan求桥,算法流程详见核心代码:
void tarjan(int k){
dfn[k]=low[k]=++cnt;
//fa[k]=(edge){f,0,fid};
for(int i=head[k];i;i=e[i].nxt){
int v=e[i].to;
if(!dfn[v]){
fa[v]=e[i].id;//标记该边已走过,防止沿无向边返回
tarjan(v);
low[k]=min(low[v],low[k]);
}else
if(fa[k]!=e[i].id)low[k]=min(low[k],dfn[v]);//在不走无向边的情况下更新low
}
if(fa[k]&&low[k]==dfn[k])//若节点k的low=dfn则k在一个联通块中处于搜索树的顶部,那么节点k的父边一定为割边
ans[++na]=fa[k];
}
模板题:zoj2588
题目大意:给出一个无向图,按顺序输出割边序号。
好久没用zoj,PE几次,若无割边要加个判断,以免多输出个0
#include<cstring>
#include<cstdio>
#include<algorithm>
#define foru(i,x,y) for(int i=x;i<=y;i++)
#define clr(x) memset(x,0,sizeof(x))
using namespace std;
const int N=;
struct edge{int to,nxt,id;}e[];
int head[N],dfn[N],low[N],ans[N],ne,na,cnt,n,m;
int fa[N];
void add(int a,int b,int c){
e[++ne]=(edge){b,head[a],c};head[a]=ne;
} void tarjan(int k){
dfn[k]=low[k]=++cnt;
//fa[k]=(edge){f,0,fid};
for(int i=head[k];i;i=e[i].nxt){
int v=e[i].to;
if(!dfn[v]){
fa[v]=e[i].id;//标记该边已走过,防止沿无向边返回
tarjan(v);
low[k]=min(low[v],low[k]);
}else
if(fa[k]!=e[i].id)low[k]=min(low[k],dfn[v]);//在不走无向边的情况下更新low
}
if(fa[k]&&low[k]==dfn[k])//若节点k的low=dfn则k在一个联通块中处于搜索树的顶部,那么节点k的父边一定为割边
ans[++na]=fa[k];
} int main(){
int T,u,v;
scanf("%d",&T);
while(T--){
clr(e);clr(head);clr(dfn);clr(low);clr(fa);clr(ans);
ne=na=cnt=;
scanf("%d%d",&n,&m);
foru(i,,m){
scanf("%d%d",&u,&v);
add(u,v,i);add(v,u,i);
}
foru(i,,n)
if(!dfn[i])tarjan(i);
sort(ans+,ans++na);
printf("%d\n",na);
if(na){
foru(i,,na-)printf("%d ",ans[i]);printf("%d\n",ans[na]);}
if(T)printf("\n");
}
return ;
}
zoj2588-tarjan求桥/割边的更多相关文章
- tarjan求桥、割顶
若low[v]>dfn[u],则(u,v)为割边.但是实际处理时我们并不这样判断,因为有的图上可能有重边,这样不好处理.我们记录每条边的标号(一条无向边拆成的两条有向边标号相同),记录每个点的父 ...
- Tarjan 求桥,割,强连通
最近遇到了这种模板题,记录一下 tarjan求桥,求割 #include <bits/stdc++.h> using namespace std; #define MOD 99824435 ...
- Tarjan求桥
传送门(poj3177) 这道题是Tarjan求桥的模板题.大意是要求在原图上加上数量最少的边,使得整张图成为一个边双联通分量. 具体的做法是,先在图中求出所有的桥,之后把边双联通分量缩成点,这样的话 ...
- hdu 4738 Caocao's Bridges (tarjan求桥)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4738 题目大意:给一些点,用一些边把这些点相连,每一条边上有一个权值.现在要你破坏任意一个边(要付出相 ...
- Codeforces 700 C. Break Up(Tarjan求桥)
题意 给你一个有 \(n\) 个点, \(m\) 条边的无向图,每条有边权 \(w_i\) ,现在要选择至多两条边断开,使得 \(S, T\) 不连通,并且使得边权和尽量小. \(n \le 1000 ...
- tarjan求割点割边的思考
这个文章的思路是按照这里来的.这里讨论的都是无向图.应该有向图也差不多. 1.如何求割点 首先来看求割点.割点必须满足去掉其以后,图被分割.tarjan算法考虑了两个: 根节点如果有两颗及以上子树,它 ...
- UVA 796 Critical Links(Tarjan求桥)
题目是PDF就没截图了 这题似乎没有重边,若有重边的话这两点任意一条边都不是桥,跟求割点类似的原理 代码: #include <stdio.h> #include <bits/std ...
- UVA796 - Critical Links(Tarjan求桥)
In a computer network a link L, which interconnects two servers, is considered critical if there are ...
- HDU-4612 Warm up,tarjan求桥缩点再求树的直径!注意重边
Warm up 虽然网上题解这么多,感觉写下来并不是跟别人竞争访问量的,而是证明自己从前努力过,以后回头复习参考! 题意:n个点由m条无向边连接,求加一条边后桥的最少数量. 思路:如标题,tarjan ...
随机推荐
- tp5 输入域名即访问指定页面
遇到PC官网类型的项目,经常会遇到隐藏入口文件和输入域名即可打开官网首页的需求.需要修改站点的默认加载文件和伪静态的配置才可以生效. 以下为nginx1.15版本,宝塔面板的修改方式.修改入口文件为w ...
- 2.0 虚拟机linu开启ssh服务与FTP
2.1.1.当本地机器ssh连接过一次虚拟主机.虚拟主机重启过或者配置发生改变 需要重新配对密钥,需要先清除本地缓存的密钥 ssh-keygen -R "ip" 2.1.2. ...
- Linux-IO多路复用select函数实践
#include <stdio.h> #include <unistd.h> #include <string.h> #include <sys/time.h ...
- rename 修改文件名
Linux的 rename 命令有两个版本,一个是C语言版本的,一个是Perl语言版本的,早期的Linux发行版基本上使用的是C语言版本的,现在已经很难见到C语言版本的了,由于历史原因,在Perl语言 ...
- Ubuntu16.04编译tensorflow的C++接口
原文:https://www.bearoom.xyz/2018/09/27/ubuntu1604buildtf4cpp/ 之前有一篇介绍到在windows下利用VS2015编译tensorflow的C ...
- 今天 运营同事发现的bug记录 上传商品时商品名称带双引号 导致输出页面时 双引号被转义
例如 ”sk||““美白”淡化 这样输出表单页面时显示出来的只有sk|| 解决办法 把输出文字对双引号进行转义
- AES学习小结
AES是基于数据块的加密方式,即每次处理的数据是一块(16字节),当数据不是16字节的倍数时填充,这就是所谓的分组密码(区别于基于比特位的流密码),16字节是分组长度. AES支持五种模式:CBC,C ...
- linux 查看链接库的版本
我们编译可执行文件的时候,会链接各种依赖库, 但是怎么知道依赖库的版本正确呢? 下面有几种办法: ldd 这是比较差的,因为打印结果更与位置相关 dpkg -l | grep libprotobuf ...
- My97DatePicker日历插件
My97DatePicker具有强大的日期功能,能限制日期范围,对于编写双日历比较简便. 注意事项: My97DatePicker目录是一个整体,不可以破坏 My97DatePicker.html 是 ...
- iterm2 粘贴时有多余字符 0~ 1~
https://github.com/ChrisJohnsen/tmux-MacOSX-pasteboard/issues/31 printf '\e[?2004l'