求桥(无向图)
来源:互联网 发布:网络投资理财万盈金融 编辑:程序博客网 时间:2024/05/16 17:21
一个无向连通图。输出它的桥边的数量。
可能有自环或者重边哟~
输入格式:
第一行两个整数n,m,表示点数和边数。(点从1开始编号)
接下来每行两个整数表示一条边。
输出格式:
一个整数,表示桥边数量。
样例输入:
4 4
1 2
2 3
3 1
1 4
样例输出:
1
数据范围:
n<=100000,m<=200000
时间限制:
1s
空间限制:
64MB
仍是与求割点同样的方法,但是邻接表的常见错误此处注意,求桥的话我们要存他的爸爸边,顺便可求他的逆边,要是 是你便跳过去注意此处low一定是要大于(我记录的是dfs层数,非序。
用fae的好处:只记录一条这样的边,这样再搜到这条边时会赋回来。这样就手动解决了重边
#include<bits/stdc++.h>using namespace std;#define N 400001#define M 400001#define forw(i,x) for(int i=fir[x];i;i=ne[i])#define PER(i,a,b) for(int i=a;i<=b;i++)int n,m;int ne[M],fir[M],val[M],to[M],root,fa[M],dfn[M],low[M];int u,v;int ans,cnt=1;bool vis[M];void add(int u,int v){ to[++cnt]=v;ne[cnt]=fir[u];fir[u]=cnt;}void dfs(int df,int no,int fae){ dfn[no]=df; vis[no]=1; low[no]=df; forw(i,no) { if(!vis[to[i]]) { dfs(df+1,to[i],i); low[no]=min(low[no],low[to[i]]); if(low[to[i]]>dfn[no]) ans++; } else { if(i!=(fae^1)) low[no]=min(low[no],low[to[i]]); } }}//滚粗啊!一开始把边的编号搞到了vis上,直接伪:论邻接表的常见问题 int main(){ scanf("%d%d",&n,&m); PER(i,1,m) { scanf("%d%d",&u,&v); add(u,v);add(v,u); } root=1; dfs(1,root,-1); cout<<ans<<endl;}
阅读全文
0 0
- 求桥(无向图)
- VUA 796 (无向图 求桥)
- 无向图 求EBC+ 求桥 + 缩点 【模版】
- 无向图求环路
- poj1515Street Directions【无向图->有向图 链式前向星版tarjan求桥】
- 无向图求双连通分量以及桥
- 796 Critical Links( 求无向图中的桥--模板)
- hdu4738 Caocao's Bridges 无向图 tarjan 求桥
- poj3694 Network 无向图tarjan求桥+LCA
- ZOJ 2588 Burning Bridges 求无向图的桥
- acdreamOJ 1236 求无向图的桥
- 求无向图的割点和桥
- hdu4738Caocao's Bridges tarjan求无向图的桥
- hdoj 4738 tarjan求无向图的桥
- 求无向图的割点和桥
- 求无向图的 割点和桥 【模版】
- hdu 3849 求无向图的桥
- hdu4738(求一个无向图的桥的最小值)
- Java 中的双重检查(Double-Check)
- 使用Android的webview将web app打包成安卓的app和解决安卓webview不支持input type=file问题
- MySQL 学习<九> 存储过程和函数
- [线段树 段更新] HDU
- 音视频数据处理(8)--- H.264基本概念抽取
- 求桥(无向图)
- Android笔记:Android 7.0 FileUriExposedException 解决
- 2017年上海金马五校程序设计竞赛(网上资格赛) Problem H : DHU Club Festival 贪心
- Android入门之ListView
- Linux加载DTS设备节点的过程(以高通8974平台为例)
- C语言算法之回溯法
- Activity的oncreate的100ms以后才有主、子线程
- Xlib简单编程
- poj2528 Mayor's posters 线段树离散化+lazy标记