引入
所谓边双联通分量,其实有点像割边+强联通分量,做法是:
1求出桥
2dfs一遍,并且不经过桥,这样刚好把图分成了几个边双联通分量。
例题
[USACO06JAN]冗余路径Redundant Paths
分析
我们先用tarjan求出边双连通分量,那么每个边双连通分量中任意两点一定不止一条路(没有桥),
那么如果两个点不在同一个边双连通分量里呢?
这时我们就需要建边了,而在哪个边双连通分量里建边呢?
肯定是入度为1的呀(也就是叶结点)!题目中要求建边要最少,所以我们可以把叶结点两两连接。
如果有落单的叶结点,就再连一条边。
代码
#include<bits/stdc++.h>
using namespace std;
#define N 5000+5
#define E 10000+5
int head[N],cnt=1;
struct Node{
int to,nxt;
}e[E];
void add(int u,int v){
++cnt;
e[cnt].to=v;
e[cnt].nxt=head[u];
head[u]=cnt;
}
int n,r;
int dfn[N],low[N],bridge[N],t;
int c[N