poj 3352Road Construction(无向双连通分量的分解)

简介:
/*
   题意:给定一个连通的无向图G,至少要添加几条边,才能使其变为强连通图(指的是边强联通)。 
   思路:利用tarjan算法找出所有的双联通分量!然后根据low[]值的不同将双联通分量
   进行缩点,最后图形会变成一棵树!也就是添加至少多少条边使一棵树变成强联通图! 
   
   知识点:若要使得任意一棵树,在增加若干条边后,变成一个双连通图,那么
           至少增加的边数 =( 这棵树总度数为1的结点数 + 1 )/ 2 
           
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
#define N 1005
using namespace std;
vector<int>g[N]; 
int low[N], pre[N]; 
int deg[N];
int n, m;
int cnt;
int dfsClock;
void dfs(int u, int fa){
    low[u]=pre[u]=++dfsClock;
    int len=g[u].size();
    for(int i=0; i<len; ++i){
        int v=g[u][i];
        if(!pre[v]){
           dfs(v, u);
           low[u]=min(low[u], low[v]);
        }
        else if(pre[v] < pre[u] && fa!=v)
           low[u]=min(pre[v], low[u]);
    }
}

int main(){
    while(scanf("%d%d", &n, &m)!=EOF){
        memset(pre, 0, sizeof(pre));
        memset(deg, 0, sizeof(deg));
        while(m--){
           int u, v;
           scanf("%d%d", &u, &v);
           g[u].push_back(v);
           g[v].push_back(u);
        }
        cnt=0;
        dfsClock=0;
        dfs(1, -1);
        for(int i=1; i<=n; ++i){
           int len=g[i].size();
           for(int j=0; j<len; ++j){
                  int v=g[i][j];
                  if(low[i]!=low[v])
                   ++deg[low[i]];
           }
        }
        for(int i=1; i<=n; ++i)
            if(deg[i]==1)
               ++cnt;
        printf("%d\n", (cnt+1)/2);
        for(int i=1; i<=n; ++i)
           g[i].clear();
    }
    return 0;
}









本文转自 小眼儿 博客园博客,原文链接:http://www.cnblogs.com/hujunzheng/p/3909568.html,如需转载请自行联系原作者
目录
相关文章
|
2月前
|
机器学习/深度学习 安全 Java
hdu-1596-find the safest road(dijkstra)
hdu-1596-find the safest road(dijkstra)
16 0
|
10月前
|
算法
The kth great number(小根堆思想,模板题)
The kth great number(小根堆思想,模板题)
30 0
The kth great number(小根堆思想,模板题)
|
11月前
|
机器学习/深度学习 存储 缓存
Lecture 3:动态规划
Lecture 3:动态规划
AtCoder Beginner Contest 214 D.Sum of Maximum Weights (思维 并查集)
AtCoder Beginner Contest 214 D.Sum of Maximum Weights (思维 并查集)
96 0
AtCoder Beginner Contest 223 D - Restricted Permutation(建图 思维 构造 拓扑排序)
AtCoder Beginner Contest 223 D - Restricted Permutation(建图 思维 构造 拓扑排序)
95 0
|
人工智能 BI
AtCoder Beginner Contest 216 F - Max Sum Counting (降维 背包dp)
AtCoder Beginner Contest 216 F - Max Sum Counting (降维 背包dp)
107 0
|
机器学习/深度学习
AtCoder Beginner Contest 218 F - Blocked Roads (最短路径还原 思维)
AtCoder Beginner Contest 218 F - Blocked Roads (最短路径还原 思维)
85 0
2019CCPC秦皇岛HDU - 6736 F - Forest Program(dfs找环 组合数学)
2019CCPC秦皇岛HDU - 6736 F - Forest Program(dfs找环 组合数学)
83 0
AtCoder Beginner Contest 216 G - 01Sequence (并查集 贪心 树状数组 差分约束)
AtCoder Beginner Contest 216 G - 01Sequence (并查集 贪心 树状数组 差分约束)
125 0