{part2}DFN+LOW(tarjan)割边
首先非树边肯定不是割边,因为去掉它DFS树不受影响,只要还能生成一棵DFS树那么图就是连通的。
然后割掉一条树边只可能造成一个点与它的父亲不连通。
那好办,也就是说这个以这个点为根的子树就是上面所说的满足条件的子树,也就是它没有返祖边,不过要注意的是,这里的low被重定义为每个点沿着除了父边之外的所有边能访问到的最小的dfn值,请结合割点割边的含义以及上面加粗的字体理解这句话,差别其实就在于x到父亲可能会有重边。
其他的都一样,核心还是判断x是否是这样的一棵子树。
直接上例题:
天凯是苏联的总书记。苏联有n个城市,某些城市之间修筑了公路。任意两个城市都可以通过公路直接或者间接到达。
天凯发现有些公路被毁坏之后会造成某两个城市之间无法互相通过公路到达。这样的公路就被称为dangerous pavement。
为了防止美帝国对dangerous pavement进行轰炸,造成某些城市的地面运输中断,天凯决定在所有的dangerous pavement驻扎重兵。可是到底哪些是dangerous pavement呢?你的任务就是找出所有这样的公路。
第一行n,m(1<=n<=150, 1<=m<=5000),分别表示有n个城市,总共m条公路。
以下m行每行两个整数a, b,表示城市a和城市b之间修筑了直接的公路
6 6
1 2
2 3
2 4
3 5
4 5
5 6
输出有若干行。每行包含两个数字a,b(a<b),表示<a,b>是dangerous pavement。请注意:输出时,所有的数对<a,b>必须按照a从小到大排序输出;如果a相同,则根据b从小到大排序。
1 2
5 6
cpp:
#include<iostream>
#include<string>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<iomanip>
#include<queue>
#include<vector>
#include<ctime>
using namespace std;
const int maxn=;
int len=,linkk[maxn];
int n,m,ind=,top=;
int dfn[maxn],low[maxn];
struct node
{
int x,y;
}e[maxn],ans[maxn]; void init(int xx,int yy)
{
e[++len].y=linkk[xx];linkk[xx]=len;
e[len].x=yy;
} void dfnlow(int x,int p=)
{
int y;
dfn[x]=low[x]=++ind;
for(int i=linkk[x];i;i=e[i].y)
{
y=e[i].x;
if(!dfn[y])
{
dfnlow(y,x);
if(low[y]<low[x])
low[x]=low[y];
if(dfn[x]<low[y])
ans[++top].x=x,ans[top].y=y;
}
else if(dfn[y]<low[x]&&y!=p)
low[x]=dfn[y];
}
} bool mys(node a,node b)
{
return a.x<b.x||a.x==b.x&&a.y<b.y;
} int main()
{
/*freopen("2.in","r",stdin);
freopen("2.out","w",stdout);*/
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=;i<=m;i++)
{
int a,b;
cin>>a>>b;
init(a,b);
init(b,a);
}
for(int i=;i<=n;i++)
if(!dfn[i])
{
dfnlow(i,i);
}
sort(ans+,ans++top,mys);
for(int i=;i<=top;i++)
cout<<ans[i].x<<" "<<ans[i].y<<endl;
return ;
}
{part2}DFN+LOW(tarjan)割边的更多相关文章
- hdu-4738(tarjan割边)
题意:给你n个点,m条边,边有权值,问你最小的花费使图不连通: 解题思路:就是求边权最小的割边,但这道题有坑点: 1.有重边(桥的两个点有重边时,你去掉一条边并没什么d用): 2.当权值为0的时候,我 ...
- {part1}DFN+LOW(tarjan)割点
什么是jarjan? 1)求割点 定义:在无向连通图中,如果去掉一个点/边,剩下的点之间不连通,那么这个点/边就被称为割点/边(或割顶/桥). 意义:由于割点和割边涉及到图的连通性,所以快速地求出割点 ...
- HDU4738 tarjan割边|割边、割点模板
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4738 坑点: 处理重边 图可能不连通,要输出0 若求出的结果是0,则要输出1,因为最少要派一个人 #inc ...
- P2746 [USACO5.3]校园网Network of Schools [tarjan缩点]
题目描述 一些学校连入一个电脑网络.那些学校已订立了协议:每个学校都会给其它的一些学校分发软件(称作“接受学校”).注意即使 BB 在 AA 学校的分发列表中,AA 也不一定在 BB 学校的列表中. ...
- Hdu 4738【tanjan求无向图的桥】割边判定定理 dfn[x] < low[y]
题目: 曹操在长江上建立了一些点,点之间有一些边连着.如果这些点构成的无向图变成了连通图,那么曹操就无敌了.刘备为了防止曹操变得无敌,就打算去摧毁连接曹操的点的桥.但是诸葛亮把所有炸弹都带走了,只留下 ...
- Tarjan判断为什么不能把dfn写成low
Tarjan,我相信大多数人是这么写的: void tarjan(int x) { dfn[x]=low[x]=++cnt; st.push(x),vis[x]=1; for(int i=head[x ...
- hihoCoder 1183 连通性一·割边与割点(Tarjan求割点与割边)
#1183 : 连通性一·割边与割点 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 还记得上次小Hi和小Ho学校被黑客攻击的事情么,那一次攻击最后造成了学校网络数据的丢 ...
- 【NOIP训练】【Tarjan求割边】上学
题目描述 给你一张图,询问当删去某一条边时,起点到终点最短路是否改变. 输入格式 第一行输入两个正整数,分别表示点数和边数.第二行输入两个正整数,起点标号为,终点标号为.接下来行,每行三个整数,表示有 ...
- 【学习整理】Tarjan:强连通分量+割点+割边
Tarjan求强连通分量 在一个有向图中,如果某两点间都有互相到达的路径,那么称中两个点强联通,如果任意两点都强联通,那么称这个图为强联通图:一个有向图的极大强联通子图称为强联通分量. 算法可以在 ...
随机推荐
- 0x7c95caa2指令引用的0x00000000内存 该内存不能read
出现这样的错误,往往和动态库有关系! 解决方法:
- Mac上安装与更新Ruby,Rails运行环境
Mac安装后就安装Xcode是个好主意,它将帮你安装好Unix环境需要的开发包,也可以独立安装command_line_tools_for_xcode 1.安装RVM RVM:Ruby Version ...
- python获取指定时间段内的随机不重复的时间点
上篇 <python时间时分秒与秒数的互相转换>http://www.cnblogs.com/gayhub/p/6154707.html 提到了把时间转成秒数的方法, 这篇写写转换成秒数后 ...
- 关于HttpURLConnection.setFollowRedirects
public static void HttpURLConnection.setFollowRedirects(boolean followRedirects)public void HttpURLC ...
- window下安装jupyter
1.Install [Anaconda](https://docs.continuum.io/anaconda/install#anaconda-install) 实际上安装了anaconda就已经安 ...
- JS第二天简单总结
布尔型变量:true,flase 广泛用于真假的逻辑判断 对象:分类,对象是由一些彼此相关的属性和方法集合在一起而构成的一个数据实体: 例如,var today = new Date();中,Date ...
- hdu 2074
ps:WA了好多次...因为首先是n=1的情况,其次是中心花色和外花色,中心花色也有可能是最外层花色....很无语. 然后就是格式问题咯. 代码 #include "stdio.h" ...
- 互联网中一些常用指标(PV、UV、蹦失率、转换率、退出率)
1) PV:PageView 页面点击量,每次刷新就算一次浏览,多次打开同一页面会累加. 通常是衡量网站的主要指标. 2)UV:Unique Visitor一天内访问网站的人数(是以cookie为 ...
- JQuery的一些简单操作02
一.遍历 1.向下遍历,children.find children只能向下遍历儿子节点的所有元素,find遍历当前元素下面的所有子节点 2.向上遍历,parent,parents,parentsUn ...
- BZOJ 1468 树分治
求出子树的重心后求出它每个子节点的距离,排序后就可以统计距离小于等于K的点对的个数了,但是会在同一子树内重复,然后在每个子树里面减去小于等于K的点对个数就可以了. #include <iostr ...