Redundant Paths POJ - 3177(边—双连通分量)

题意:

在图中加边 看最少能通过加多少条边把 图变成边—双连通分量

解析:

先做一次dfs,不同的连通分量的low是不同的  注意重边

缩点

统计度为1的点  那么需要加的边为(ret+1)/2

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <stack>
#define mem(a, b) memset(a, b, sizeof(a))
using namespace std;
const int maxn = 5005, INF = 0x7fffffff;
int dfn[maxn], low[maxn], drgee[maxn];
bool graph[5005][5005];
int dfs_clock, n, m, ret;
vector<int> G[maxn];
void init()
{
    for(int i=0; i<=n; i++) G[i].clear();
    ret = 0;
    dfs_clock = 0;
    mem(low, 0);
    mem(dfn, 0);
    mem(drgee, 0);
    mem(graph, 0);
}

void tarjan(int u, int fa)
{
    dfn[u] = low[u] = ++dfs_clock;
    for(int i=0; i<G[u].size(); i++)
    {
        int v = G[u][i];
        if(!dfn[v])
        {
            tarjan(v, u);
            low[u] = min(low[u], low[v]);
        }
        else if(v != fa)
        {
            low[u] = min(low[u], dfn[v]);
        }
    }
}

int main()
{

   while(cin>> n >> m){
    init();
    for(int i=0; i<m; i++)
    {
        int u, v;
        cin>> u >> v;
        if(!graph[u][v])
        {
            graph[u][v] = graph[v][u] = 1;
            G[u].push_back(v);
            G[v].push_back(u);
        }
    }
    tarjan(1, -1);
    for(int i=1; i<=n; i++)
        for(int j=0; j<G[i].size(); j++)
            if(low[i] != low[G[i][j]])
                drgee[low[i]]++;
    for(int i=0; i<=n; i++)
        if(drgee[i] == 1)
            ret++;
    cout<< (ret+1)/2 <<endl;
   }

    return 0;
}

原文地址:https://www.cnblogs.com/WTSRUVF/p/9304299.html

时间: 2024-10-09 21:42:32

Redundant Paths POJ - 3177(边—双连通分量)的相关文章

Redundant Paths POJ - 3177(边双连通)

Redundant Paths POJ - 3177 题意:一个无向图(有重边!!),问至少还要加多少边使得去掉任意一条边后任意两点仍可互达. 和上题poj3352基本相同,不过dfs的时候,不能用v!=f来判断是否能走,而要用当前走的边和上一条边是不是反向边 1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cstring> 5 using namesp

POJ 3177 Redundant Paths (桥,边双连通分量,有重边)

题意:给一个无向图,问需要补多少条边才可以让整个图变成[边双连通图],即任意两个点对之间的一条路径全垮掉,这两个点对仍可以通过其他路径而互通. 思路:POJ 3352的升级版,听说这个图会给重边.先看3352的题解http://www.cnblogs.com/xcw0754/p/4619594.html. 其实与3352不同的就是重边出现了怎么办?假如出现的重边刚好是桥呢? 首先要知道,[割点]可以将两个[点双连通分量]隔开来,因为仅一个[点双连通分量]中肯定无割点,那么每两个点对都同时处于若干

Redundant Paths POJ - 3177

无向图概念:(这里的x->y表示x和y之间有一条无向边)1.桥:对于一个无向图,如果删除某条边后,该图的连通分量增加,则称这条边为桥 比如1->2->3->4这样一个简单得图一共有3个桥,分别是1->2,2->3,3->4 1->2->3->4->1 这样就没有桥,因为删除任意一个边,任意两点还可以互相往来(因为是双向边嘛) 2.割点/割项:对于一个无向图,如果删除某个节点u后,该图的连通分量增加,则节点u为割项或关节点 1->2-&

E - Redundant Paths - poj 3177(缩点求叶子节点)

题意:给一个图,想让每两条路都有两条边相,不过特殊的是相同的边多次相连也被认为是一条边,现在求最少还需要添加几条边才能做到 分析:手欠没看清楚是相同的边不能相连,需要去重边,缩点后求出来叶子节点的数目即可. *********************************************************************** #include<stdio.h>#include<string.h>#include<algorithm>using n

POJ 3177 Redundant Paths POJ 3352 Road Construction(双连通)

POJ 3177 Redundant Paths POJ 3352 Road Construction 题目链接 题意:两题一样的,一份代码能交,给定一个连通无向图,问加几条边能使得图变成一个双连通图 思路:先求双连通,缩点后,计算入度为1的个数,然后(个数 + 1) / 2 就是答案(这题由于是只有一个连通块所以可以这么搞,如果有多个,就不能这样搞了) 代码: #include <cstdio> #include <cstring> #include <algorithm&

POJ 3177 边双连通求连通量度的问题

这道题的总体思路就是找到连通量让它能够看作一个集合,然后找这个集合的度,度数为1的连通量为k,那么需要添加(k+1)/2条边才可以保证边双连通 这里因为一个连通量中low[]大小是相同的,所以我们用ans[low[i]]++来计度数 这道题我最开始按学长的模板来写....MLE到哭了,也不知道这道题为什么这么逗,把5000的数组改成1000也能过,当然后来换了别的思路 为了防止重边的进入,开始设置了一个hash[][]二维数组来判断边是否已经存在,不额外添入 之后,我不采用二维数组,而是在get

poj 3177 Redundant Paths(tarjan边双连通)

题目链接:http://poj.org/problem?id=3177 题意:求最少加几条边使得没对点都有至少两条路互通. 题解:边双连通顾名思义,可以先求一下连通块显然连通块里的点都是双连通的,然后就是各个连通块之间的问题. 也就是说只要求一下桥,然后某个连通块桥的个数位1的总数,结果就是(ans+1)/2.为什么是这个结果自行画图 理解一下,挺好理解的. #include <iostream> #include <cstring> #include <cstdio>

POJ 3694 边双连通分量+LCA

Network Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 6837   Accepted: 2435 Description A network administrator manages a large network. The network consists of N computers and M links between pairs of computers. Any pair of computers

poj 3177 Redundant Paths (双联通)

/******************************************************* 题目:Redundant Paths (poj 2177) 链接:http://poj.org/problem?id=3177 算法:双联通+缩点 思路:先找出所有双联通分量,把这些分量缩成一个点 再找出所有度为一的点,用这些点数加一除2就可以了 ********************************************************/ #include<cs