POJ 3177 Redundant Paths(边双连通分量+tarjan)

题目链接:http://poj.org/problem?id=3177

题目大意:给你一个连通图,问你最少添加几条边能组成一个边双连通图,有重边

思路:我们将所有的双连通块看成一个点,因为他们是连通的且不成一个环,利用tarjan缩点后就可以看做一棵树

这样的树至少需要加多少条边就能构成一个双连通图呢,我们只需要将叶子节点连起来即可,因为是无向图,所以

度为1的就是叶节点而不是度为0,这样我们要添加的边数就为(叶子结点总数+1)/2,加1是因为叶子结点可能为

奇数的,而且要注意tarjan在无向图与有向图的不同写法

上代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define inf 0x3f3f3f3f
#define mod 1e9+7
#define ll long long
#define maxn 5000+10
vectorG[maxn];
bool visit[maxn],falg[maxn][maxn];
int dfn[maxn], low[maxn], cnt[maxn];
int n, m,index;
void tarjan(int u, int father)
{
	dfn[u] = low[u] = ++index;
	visit[u] = true;
	for (int i = 0; i < G[u].size(); i++)
	{
		int k = G[u][i];
		if (!visit[k])
		{
			tarjan(k, u);
			low[u] = min(low[u], low[k]);
		}
		else if (visit[k]&&(k != father))//自己不能回到父节点,必须透过其他路径回去
			low[u] = min(low[u], dfn[k]);//为什么是dfn[v],因为如果low[v]


你可能感兴趣的:(连通性,边双连分量)