SPF Tarjan算法求无向图割点(关节点)入门题
题目抽象,给出一个连通图的一些边,求关节点。以及每个关节点分出的连通分量的个数
邻接矩阵只要16ms,而邻接表却要32ms, 花费了大量的时间在加边上。
// time 16ms
1 #include <iostream>
2 #include <cstdio>
3 #include <cstring>
4 #include <cmath>
5 #include <algorithm>
6 #include <string>
7 #include <vector>
8 #include <set>
9 #include <map>
10 #include <stack>
11 #include <queue>
12 #include <sstream>
13 #include <iomanip>
14 using namespace std;
15 typedef long long LL;
16 const int INF = 0x4fffffff;
17 const double EXP = 1e-5;
18 const int MS = 1005;
19 const int SIZE = 100005;
20
21 int edges[MS][MS];
22 int vis[MS];
23 int dfn[MS];
24 int low[MS];
25 int subnets[MS];
26 int nodes;
27 int tdfn;
28 int sons;
29
30 void init()
31 {
32 low[1]=dfn[1]=1;
33 tdfn=1;sons=0;nodes=0;
34 memset(vis,0,sizeof(vis));
35 vis[1]=1;
36 memset(subnets,0,sizeof(subnets));
37 memset(edges,0,sizeof(edges));
38 }
39
40 void DFS(int u)
41 {
42 for(int v=1;v<=nodes;v++)
43 {
44 if(edges[u][v])
45 {
46 if(!vis[v])
47 {
48 vis[v]=1;
49 dfn[v]=low[v]=++tdfn; // 初始化
50 DFS(v); // low[v]的值已经求出
51 low[u]=min(low[u],low[v]);
52 if(low[v]>=dfn[u])
53 {
54 if(u!=1)
55 subnets[u]++;
56 else
57 sons++;
58 }
59 }
60 else // v已经访问过了,v是u的祖先节点,(v,u)是一条回边
61 low[u]=min(low[u],dfn[v]);
62 }
63 }
64 }
65
66 int main()
67 {
68 int u,v,find,number=1;
69 while(1)
70 {
71 scanf("%d",&u);
72 if(!u)
73 break;
74 init();
75 scanf("%d",&v);
76 if(u>nodes)
77 nodes=u;
78 if(v>nodes)
79 nodes=v;
80 edges[u][v]=edges[v][u]=1;
81 while(1)
82 {
83 scanf("%d",&u);
84 if(!u)
85 break;
86 scanf("%d",&v);
87 if(u>nodes)
88 nodes=u;
89 if(v>nodes)
90 nodes=v;
91 edges[u][v]=edges[v][u]=1;
92 }
93 if(number>1)
94 printf("\n");
95 printf("Network #%d\n",number++);
96 DFS(1);
97 if(sons>1)
98 subnets[1]=sons-1;
99 find=0;
100 for(int i=1;i<=nodes;i++)
101 {
102 if(subnets[i])
103 {
104 find=1;
105 printf(" SPF node %d leaves %d subnets\n",i,subnets[i]+1);
106 }
107 }
108 if(!find)
109 printf(" No SPF nodes\n");
110
111 }
112 return 0;
113 }
邻接表 time==32ms
1 // time 32ms
2 #include <iostream>
3 #include <cstdio>
4 #include <cstring>
5 #include <cmath>
6 #include <algorithm>
7 #include <string>
8 #include <vector>
9 #include <set>
10 #include <map>
11 #include <stack>
12 #include <queue>
13 #include <sstream>
14 #include <iomanip>
15 using namespace std;
16 typedef long long LL;
17 const int INF = 0x4fffffff;
18 const double EXP = 1e-5;
19 const int MS = 1005;
20 const int SIZE = 100005;
21
22 //int edges[MS][MS];
23 struct edge
24 {
25 int v,next;
26 }edges[(MS*MS)]; // 理论上是(MS*MS)<<1,超内存。但这种情况是超级极端。(MS*MS)足够
27 int head[MS];
28
29 int vis[MS];
30 int dfn[MS];
31 int low[MS];
32 int subnets[MS];
33 int nodes;
34 int tdfn;
35 int sons;
36 int cnt;
37
38 void init()
39 {
40 low[1]=dfn[1]=1;
41 tdfn=1;sons=0;
42 nodes=0;cnt=0;
43 memset(vis,0,sizeof(vis));
44 vis[1]=1;
45 memset(subnets,0,sizeof(subnets));
46 memset(edges,0,sizeof(edges));
47 memset(head,-1,sizeof(head));
48 }
49
50 void add(int u,int v)
51 {
52 edges[cnt].v=v;edges[cnt].next=head[u];head[u]=cnt++;
53 edges[cnt].v=u;edges[cnt].next=head[v];head[v]=cnt++;
54 }
55
56 void DFS(int u)
57 {
58 for(int i=head[u];i!=-1;i=edges[i].next)
59 {
60 int v=edges[i].v;
61 if(!vis[v])
62 {
63 vis[v]=1;
64 dfn[v]=low[v]=++tdfn;
65 DFS(v);
66 low[u]=min(low[u],low[v]);
67 if(low[v]>=dfn[u])
68 {
69 if(u!=1)
70 subnets[u]++;
71 else
72 sons++;
73 }
74 }
75 else
76 low[u]=min(low[u],dfn[v]);
77 }
78 }
79
80 int main()
81 {
82 int u,v,find,number=1;
83 while(1)
84 {
85 scanf("%d",&u);
86 if(!u)
87 break;
88 init();
89 scanf("%d",&v);
90 if(u>nodes)
91 nodes=u;
92 if(v>nodes)
93 nodes=v;
94 add(u,v);
95 while(1)
96 {
97 scanf("%d",&u);
98 if(!u)
99 break;
100 scanf("%d",&v);
101 if(u>nodes)
102 nodes=u;
103 if(v>nodes)
104 nodes=v;
105 add(u,v);
106 }
107 if(number>1)
108 printf("\n");
109 printf("Network #%d\n",number++);
110 DFS(1);
111 if(sons>1)
112 subnets[1]=sons-1;
113 find=0;
114 for(int i=1;i<=nodes;i++)
115 {
116 if(subnets[i])
117 {
118 find=1;
119 printf(" SPF node %d leaves %d subnets\n",i,subnets[i]+1);
120 }
121 }
122 if(!find)
123 printf(" No SPF nodes\n");
124 }
125 return 0;
126 }
SPF Tarjan算法求无向图割点(关节点)入门题的更多相关文章
- [Tarjan系列] Tarjan算法求无向图的双连通分量
这篇介绍如何用Tarjan算法求Double Connected Component,即双连通分量. 双联通分量包括点双连通分量v-DCC和边连通分量e-DCC. 若一张无向连通图不存在割点,则称它为 ...
- tarjan算法求无向图的桥、边双连通分量并缩点
// tarjan算法求无向图的桥.边双连通分量并缩点 #include<iostream> #include<cstdio> #include<cstring> ...
- tarjan算法--求无向图的割点和桥
一.基本概念 1.桥:是存在于无向图中的这样的一条边,如果去掉这一条边,那么整张无向图会分为两部分,这样的一条边称为桥无向连通图中,如果删除某边后,图变成不连通,则称该边为桥. 2.割点:无向连通图中 ...
- [Tarjan系列] Tarjan算法求无向图的桥和割点
RobertTarjan真的是一个传说级的大人物. 他发明的LCT,SplayTree这些数据结构真的给我带来了诸多便利,各种动态图论题都可以用LCT解决. 而且,Tarjan并不只发明了LCT,他对 ...
- Light OJ - 1026 - Critical Links(图论-Tarjan算法求无向图的桥数) - 带详细注释
原题链接 无向连通图中,如果删除某边后,图变成不连通,则称该边为桥. 也可以先用Tajan()进行dfs算出所有点 的low和dfn值,并记录dfs过程中每个 点的父节点:然后再把所有点遍历一遍 ...
- Tarjan求无向图割点、桥详解
tarjan算法--求无向图的割点和桥 一.基本概念 1.桥:是存在于无向图中的这样的一条边,如果去掉这一条边,那么整张无向图会分为两部分,这样的一条边称为桥无向连通图中,如果删除某边后,图变成不 ...
- Tarjan算法求割点
(声明:以下图片来源于网络) Tarjan算法求出割点个数 首先来了解什么是连通图 在图论中,连通图基于连通的概念.在一个无向图 G 中,若从顶点i到顶点j有路径相连(当然从j到i也一定有路径),则称 ...
- tarjan算法与无向图的连通性(割点,桥,双连通分量,缩点)
基本概念 给定无向连通图G = (V, E)割点:对于x∈V,从图中删去节点x以及所有与x关联的边之后,G分裂为两个或两个以上不相连的子图,则称x为割点割边(桥)若对于e∈E,从图中删去边e之后,G分 ...
- [学习笔记] Tarjan算法求桥和割点
在之前的博客中我们已经介绍了如何用Tarjan算法求有向图中的强连通分量,而今天我们要谈的Tarjan求桥.割点,也是和上篇有博客有类似之处的. 关于桥和割点: 桥:在一个有向图中,如果删去一条边,而 ...
随机推荐
- Linux_配置辅助DNS服务(基础)
[RHEL8]-DNSserver1:[RHEL7]-DNSserver2:[Centos7]-DNSclient !!!测试环境我们首关闭防火墙和selinux(DNSserver1.DNSserv ...
- KEIL中查看程序存储空间的大小
Program Size: Code=86496 RO-data=9064 RW-data=1452 ZI-data=16116 Code是代码占用的空间,RO-data是 Read Only 只读常 ...
- mysql-connector-java版本匹配问题:ERROR DruidDataSource - create connection SQLException(Day_45)
mysql安装的是:8.0.23,启动项目后发现报错连接不上数据库 报错信息: Druid-ConnectionPool-Create-150783284] ERROR DruidDataSource ...
- 图解CSS布局(一)- Grid布局
图解CSS布局(一)- Grid布局 先上图 简介 Grid 布局是将容器划分成"行"和"列",产生单元格,然后指定"项目所在"的单元格,可 ...
- 某SPI设备驱动引起的开关机压力测试死机问题一例
环境 硬件平台:某ARM SoC 软件平台:Linux 问题现象:产品做开关机压力测试,发生死机. 分析 用crash工具解析两次死机dump信息,得到死机前的log如下.两次死机的backtrace ...
- Jmeter(五十) - 从入门到精通高级篇 - jmeter 之模拟弱网进行测试(详解教程)
1.简介 在实际工作中,网络带宽一定不会是持续稳定的保持某一个值,而是有高有低.因此为了测试场景和实际能够无限的接近,所以我们需要模拟一下来达到效果.还有就是在实际的测试工作中,会因为业务需要,有时限 ...
- sql server 操作(不定期更新)
要求:基本的语法要清楚. sql server疑难点: 1.Partition by可以理解为 对多行数据分组后排序取每个产品的第一行数据 先处理内查询,由内向外处理,外层查询利用内层查询的结果嵌套查 ...
- CUDA上深度学习模型量化的自动化优化
CUDA上深度学习模型量化的自动化优化 深度学习已成功应用于各种任务.在诸如自动驾驶汽车推理之类的实时场景中,模型的推理速度至关重要.网络量化是加速深度学习模型的有效方法.在量化模型中,数据和模型参数 ...
- TVM优化GPU机器翻译
TVM优化GPU机器翻译 背景 神经机器翻译(NMT)是一种自动化的端到端方法,具有克服传统基于短语的翻译系统中的弱点的潜力.最近,阿里巴巴集团正在为全球电子商务部署NMT服务. 将Transform ...
- 全卷积目标检测:FCOS
全卷积目标检测:FCOS FCOS: Fully Convolutional One-Stage Object Detection 原文链接:https://arxiv.org/abs/1904.01 ...