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

简介:

1 /*
 2    题意:给定一个连通的无向图G,至少要添加几条边,才能使其变为强连通图(指的是边强联通)。 
 3    思路:利用tarjan算法找出所有的双联通分量!然后根据low[]值的不同将双联通分量
 4    进行缩点,最后图形会变成一棵树!也就是添加至少多少条边使一棵树变成强联通图! 
 5    

 6    知识点:若要使得任意一棵树,在增加若干条边后,变成一个双连通图,那么
 7            至少增加的边数 =( 这棵树总度数为1的结点数 + 1 )/ 2 
 8            
 9 */
10 #include<iostream>
11 #include<cstring>
12 #include<cstdio>
13 #include<algorithm>
14 #include<vector>
15 #define N 1005
16 using namespace std;
17 vector<int>g[N]; 
18 int low[N], pre[N]; 
19 int deg[N];
20 int n, m;
21 int cnt;
22 int dfsClock;
23 void dfs(int u, int fa){
24     low[u]=pre[u]=++dfsClock;
25     int len=g[u].size();
26     for(int i=0; i<len; ++i){
27         int v=g[u][i];
28         if(!pre[v]){
29            dfs(v, u);
30            low[u]=min(low[u], low[v]);
31         }
32         else if(pre[v] < pre[u] && fa!=v)
33            low[u]=min(pre[v], low[u]);
34     }
35 }
36 
37 int main(){
38     while(scanf("%d%d", &n, &m)!=EOF){
39         memset(pre, 0, sizeof(pre));
40         memset(deg, 0, sizeof(deg));
41         while(m--){
42            int u, v;
43            scanf("%d%d", &u, &v);
44            g[u].push_back(v);
45            g[v].push_back(u);
46         }
47         cnt=0;
48         dfsClock=0;
49         dfs(1, -1);
50         for(int i=1; i<=n; ++i){
51            int len=g[i].size();
52            for(int j=0; j<len; ++j){
53                   int v=g[i][j];
54                   if(low[i]!=low[v])
55                    ++deg[low[i]];
56            }
57         }
58         for(int i=1; i<=n; ++i)
59             if(deg[i]==1)
60                ++cnt;
61         printf("%d\n", (cnt+1)/2);
62         for(int i=1; i<=n; ++i)
63            g[i].clear();
64     }
65     return 0;
66 } 

目录
相关文章
|
SQL 分布式计算 安全
三十六、centos安装hive3.1.2(精讲篇)
三十六、centos安装hive3.1.2(精讲篇)
1342 0
三十六、centos安装hive3.1.2(精讲篇)
|
6月前
|
存储 Web App开发 缓存
磁盘空间不足怎么清理?试试这7种方法
在使用电脑过程中,C盘空间不足是常见问题。本文提供多种实用清理方法,包括分析磁盘、清理文件、使用系统工具、清除软件缓存、卸载软件、调整系统保护及分区大小等,帮助你有效释放磁盘空间,提升系统运行效率。
|
7月前
|
安全 Linux 数据安全/隐私保护
Red Hat Enterprise Linux 9.6 (x86_64, aarch64) - 红帽企业 Linux (RHEL)
Red Hat Enterprise Linux 9.6 (x86_64, aarch64) - 红帽企业 Linux (RHEL)
882 36
Red Hat Enterprise Linux 9.6 (x86_64, aarch64) - 红帽企业 Linux (RHEL)
|
存储 Linux Android开发
Rockchip系列之VendorStorage uboot/kernel/user space 阶段接口使用介绍(2)
Rockchip系列之VendorStorage uboot/kernel/user space 阶段接口使用介绍(2)
1265 0
|
运维 监控 网络协议
IPv6地址之间的转换技术:NAT66
【4月更文挑战第25天】
2277 0
IPv6地址之间的转换技术:NAT66
|
存储 Kubernetes 数据库
AWX部署
AWX部署
531 7
AWX部署
|
IDE 开发工具 Python
Python自动化操作word--批量替换word文档中的文字
Python自动化操作word--批量替换word文档中的文字
750 0
|
Linux TensorFlow 算法框架/工具
安装GPU版本的TensorFlow
【7月更文挑战第3天】安装GPU版本的TensorFlow。
543 1
分享一些在 1688 上找一件代发商品的技巧
在1688上找一件代发商品需明确自身需求与定位,筛选可靠供应商,研究商品信息,利用精准搜索和平台推荐,关注活动,并与供应商充分沟通,确保合作顺畅。