SPF

题目抽象,给出一个连通图的一些边,求关节点。以及每个关节点分出的连通分量的个数

邻接矩阵只要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算法求无向图割点(关节点)入门题的更多相关文章

  1. [Tarjan系列] Tarjan算法求无向图的双连通分量

    这篇介绍如何用Tarjan算法求Double Connected Component,即双连通分量. 双联通分量包括点双连通分量v-DCC和边连通分量e-DCC. 若一张无向连通图不存在割点,则称它为 ...

  2. tarjan算法求无向图的桥、边双连通分量并缩点

    // tarjan算法求无向图的桥.边双连通分量并缩点 #include<iostream> #include<cstdio> #include<cstring> ...

  3. tarjan算法--求无向图的割点和桥

    一.基本概念 1.桥:是存在于无向图中的这样的一条边,如果去掉这一条边,那么整张无向图会分为两部分,这样的一条边称为桥无向连通图中,如果删除某边后,图变成不连通,则称该边为桥. 2.割点:无向连通图中 ...

  4. [Tarjan系列] Tarjan算法求无向图的桥和割点

    RobertTarjan真的是一个传说级的大人物. 他发明的LCT,SplayTree这些数据结构真的给我带来了诸多便利,各种动态图论题都可以用LCT解决. 而且,Tarjan并不只发明了LCT,他对 ...

  5. Light OJ - 1026 - Critical Links(图论-Tarjan算法求无向图的桥数) - 带详细注释

     原题链接   无向连通图中,如果删除某边后,图变成不连通,则称该边为桥. 也可以先用Tajan()进行dfs算出所有点 的low和dfn值,并记录dfs过程中每个 点的父节点:然后再把所有点遍历一遍 ...

  6. Tarjan求无向图割点、桥详解

    tarjan算法--求无向图的割点和桥   一.基本概念 1.桥:是存在于无向图中的这样的一条边,如果去掉这一条边,那么整张无向图会分为两部分,这样的一条边称为桥无向连通图中,如果删除某边后,图变成不 ...

  7. Tarjan算法求割点

    (声明:以下图片来源于网络) Tarjan算法求出割点个数 首先来了解什么是连通图 在图论中,连通图基于连通的概念.在一个无向图 G 中,若从顶点i到顶点j有路径相连(当然从j到i也一定有路径),则称 ...

  8. tarjan算法与无向图的连通性(割点,桥,双连通分量,缩点)

    基本概念 给定无向连通图G = (V, E)割点:对于x∈V,从图中删去节点x以及所有与x关联的边之后,G分裂为两个或两个以上不相连的子图,则称x为割点割边(桥)若对于e∈E,从图中删去边e之后,G分 ...

  9. [学习笔记] Tarjan算法求桥和割点

    在之前的博客中我们已经介绍了如何用Tarjan算法求有向图中的强连通分量,而今天我们要谈的Tarjan求桥.割点,也是和上篇有博客有类似之处的. 关于桥和割点: 桥:在一个有向图中,如果删去一条边,而 ...

随机推荐

  1. 032.Python魔术方法__new__和单态模式

    一 __new__ 魔术方法 1.1 介绍 触发时机:实例化类生成对象的时候触发(触发时机在__init__之前) 功能:控制对象的创建过程 参数:至少一个cls接受当前的类,其他根据情况决定 返回值 ...

  2. Docker的介绍和安装(1)

    一.虚拟化简介 1.虚拟化概念 计算机虚拟化(Computing Virtualization),一种资源管理技术,是指通过虚拟化技术将一台计算机的各种实体资源 , 如处理器 , 网络 , 内存及存储 ...

  3. mysql基础之mariadb对表中数据的增删改查

    复习: 查看表:show tables; 创建表:create table 表名(字符类型); 删除表:drop table 表名; 对表的结构进行增删改查: 查看表结构:desc 表名; 修改表-添 ...

  4. 9.4-6 kill & killall & pkill

    kill:终止进程 能够终止你希望停止的进程. kill 命令的参数选项及说明 -l    列出全部的信号名称 -p    指定kill命令只打印相关进程的进程号,而不发送任何信号 -s    指定要 ...

  5. idea配置javaweb项目(最新版)

    idea(最新版)配置javaweb项目 本篇文章使用Maven构建javaweb环境 最新版maven压缩包 链接:https://pan.baidu.com/s/1El7b3YzPTZX-7QRE ...

  6. Vue的常用特性

    Vue的常用特性 一.表单基本操作 都是通过v-model 单选框 1. 两个单选框需要同时通过v-model 双向绑定 一个值 2. 每一个单选框必须要有value属性 且value值不能一样 3. ...

  7. App自动化测试之Appium环境安装(涉及雷电模拟器和真机)

    1.安装Microsoft .NET Framework 4.5 及以上版本 2.安装Appium 官方网站地址:http://appium.io/ 我装了1.17.0版本 3.安装JDK 1.8及以 ...

  8. 人体姿态和形状估计的视频推理:CVPR2020论文解析

    人体姿态和形状估计的视频推理:CVPR2020论文解析 VIBE: Video Inference for Human Body Pose and Shape Estimation 论文链接:http ...

  9. CodeGen CreateFile实用程序

    CodeGen CreateFile实用程序 CreateFile实用程序允许根据存储库文件或结构定义创建ISAM文件. CreateFile实用程序的命令行选项如下: CreateFile -f & ...

  10. python_reques接口测试框架,Excel作为案例数据源

    一.框架菜单 1.1 common模块  1.2 其他 二.Excel接口测试案例编写 三.读取Excel测试封装(核心封装) excel_utils.py  读取Excel中的数据 import o ...