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会给你的读写的内容进行缓存,会使数值非常不准确。
使用iozone测试磁盘性能 IOzone是一个文件系统测试基准工具.可以测试不同的操作系统中文件系统的读写性能.可以通过 write, re-write, read, re-read, rand ...
- shell基础之if语句
Shell流程控制 流程控制是改变程序运行顺序的指令.linux shell有一套自己的流程控制语句,其中包括条件语句(if),循环语句(for,while),选择语句(case).下面我将通过例子介 ...
- (xxx) is not defined at HTMLInputElement.onblur(Day_27)
错误: 这个报错我当时是卡了很久,方法是肯定没有问题的,但js所有的事件都失效了. 解决方案: 1.检查js命名是否有误,若外部引用js文件,尽量使用全小写命名,遵守js命名规范. 2.若还不行,请将 ...
- Qt 设置中文
1. 前言 在编写Qt应用程序时,有时会希望能直接设置中文字符串到界面,总结下其设置方法. 2. 设置中文 1)运行环境Qt5.5 VS2013 2)首先,查看需要设置中文的文件是否为UTF-8格式, ...
- ES6笔记2
ES6笔记2 Promise Promise 是 ES6 引入的异步编程的新解决方案,语法上是一个构造函数 一共有3种状态,pending(进行中).fulfilled(已成功)和rejected(已 ...
- unity项目字符串转为Vector3和Quaternion
运用环境:一般在读取csv表格的数据时是string类型转为Vector3或者Quaternion类型 字符串格式:x,x,x /x,x,x,x (英文逗号) 方法: /// <summary& ...
- Nginx实战部署常用功能演示(超详细版),绝对给力~~~
前言 上次分享了一些开发过程中常用的功能,但如果到真实环境中,其实还需要一些额外的配置,比如说跨域.缓存.配置SSL证书.高可用等,老规矩,还是挑几个平时比较常用的进行演示分享.上篇详见Nginx超详 ...
- 初遇SpringBoot踩坑与加载静态文件遇到的坑
SpringBoot开发 创建SpringBoot项目 大家都知道SpringBoot开发非常快,创建SpringBoot项目时,勾上SpringW ...
- MySQL 通过.frm文件和.ibd文件实现InnoDB引擎的数据恢复
起因是这样的,公司的领导表示说服务器崩了,修理好之后,只剩下数据库目录下的物理文件(即.frm文件与.ibd文件).然后,整了一份压缩包给我,叫我瞅一下能不能把数据恢复出来.我当场愣了一下,这都啥文件 ...
- NGINX缓存使用官方指南
我们都知道,应用程序和网站一样,其性能关乎生存.但如何使你的应用程序或者网站性能更好,并没有一个明确的答案.代码质量和架构是其中的一个原因,但是在很多例子中我们看到,你可以通过关注一些十分基础的应用内 ...