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. 在/etc/profile下配置java的环境变量

    在/etc/profile下配置java的环境变量 原创 Java 作者:xiaoyan5686670 时间:2016-01-18 14:30:28  6152  0 以root用户编辑:#vi /e ...

  2. LTP--linux稳定性测试 linux性能测试 ltp压力测试 ---IBM 的 linux test project

    LTP--linux稳定性测试 linux性能测试 ltp压力测试 ---IBM 的 linux test project Peter盼 2014-04-23 11:25:49  20302  收藏  ...

  3. Docker——Registry 通过Shell管理私有仓库镜像

    使用方法: 复制代码保存为 image_registry.sh sh image_registry.sh  -h   #查看帮助 HUB=10.0.29.104:5000 改为自己的地址 #!/bin ...

  4. C语言scanf跳出循环的问题

    注意:%C前面有个空格,如果不加空格,会跳出while循环. 第一次输入的时候,回车键会滞留在输入缓冲区,第二次要去输的时候,会直接去读回车键 在第二次要去输入的时候,可以先清除缓冲区,用getcha ...

  5. 如何对你的Linux系统进行基准测试: 3开源基准测试工具

    如何对你的Linux系统进行基准测试: 3开源基准测试工具   0 赞0 评论 文章标签:SYS  Source  benchmark  tool  开源  基准  系统     linux实用程序的 ...

  6. Mac 使用 Parallels Desktop 虚拟机安装 win10 教程

    Parallels Desktop 介绍 Parallels Desktop 是一款运行在 Mac 电脑上的极为优秀的虚拟机软件,用户可以在 Mac OS X下非常方便运行 Windows.Linux ...

  7. windows server 2008 rdp停止服务 - windows server 2012 R2 远程桌面授权模式尚未配置,远程桌面服务将在120天内停止工作

    目录 问题现象 增长rdp服务可使用时长的配置 Via & reference: 问题现象 windows server 2008作为测试环境跳板机,但是没有配置官方的rdp授权,限制用户登录 ...

  8. Hadoop系列番外篇之一文搞懂Hadoop RPC框架及细节实现

    @ 目录 Hadoop RPC 框架解析 1.Hadoop RPC框架概述 1.1 RPC框架特点 1.2 Hadoop RPC框架 2.Java基础知识回顾 2.1 Java反射机制与动态代理 2. ...

  9. Linux BSP非标准HDMI分辨率

    Linux BSP非标准HDMI分辨率 Intrinsyc公司发布了它的一个新的Linux BSP软件的发布 打开-Q820 开发套件基于Linux内核版本.支持的软件功能包括HDMI输出,可以支持标 ...

  10. C# & JS 判断字符串是否为日期格式

    在C#中,对格式的判断有一类专门函数,那就是TryParse.TryParse在各个不同的类型类(如int,string,DateTime)中,都是存在的.在TryParse中一般有两个参数,一个是待 ...