图——最小生成树

article/2025/9/16 10:40:29

图——最小生成树

1. 基本概念

在一个连通无向图G=(V, E)中,对于其中的每条边(u,v)∈E,赋予其权重w(u, v),则最小生成树问题就是要在G中找到一个连通图G中所有顶点的无环子集T⊆E,使得这个子集中所有边的权重之和w(T) = ∑ ( u , v ) ∈ T w ( u , v ) \displaystyle\sum_{(u,v)∈T} w(u, v) (u,v)Tw(u,v)最小。显然,T必然是一棵树,这样的树通常称为图G的生成树

2. 最小生成树算法

通常来说,要解决最小生成树问题,通常采用两种算法:Prim算法Kruskal算法。先假设要求一个连通无向图G=(V, E)的最小生成树T,且以其中的一个顶点V1为T的根结点。下面就分别对这两种算法进行介绍。

2.1 Prim算法

2.1.1 基本思想

Prim算法构建最小生成树的过程是:先构建一棵只包含根结点V1的树A,然后每次在连接树A结点和图G中树A以外的结点的所有边中,选取一条权重最小的边加入树A,直至树A覆盖图G中的所有结点。

注意:在这个算法中,关键点在于在连接树A结点和图G中树A以外的结点的所有边中选取权重最小的边。在算法实现过程中,要记录G中每个结点i到树A中结点的最小距离minidistance[i],以及与之相连的树A中的那个结点miniadj[i]。minidistance[i]开始都初始化为无穷大,miniadj[i]都初始化为该顶点自己;每将一个结点j加入了树A,首先令minidistance[j]=0,然后遍历图G中所有不在树A中的结点,看看往树A中加入了结点j后,这些结点到树A中结点的最小距离会不会变小,如果变小则进行调整。例如,对于结点k,它在图G中,但不在树A中,且结点k与结点j相连,该边的权重为w(k, j)。在未将结点j加入树A前,结点k到树A中结点的最小距离为minidistance[k];将结点j加入树A后,如果minidistance[k] > w(k, j),那么结点k到树A中结点的最小距离就是结点k到结点j的最小距离,所以要将minidistance[k]调整为w(k, j),且miniadj[k]为j。

例子
有一个无向连通图G,它有5个顶点,7条边,如下图所示。
在这里插入图片描述
以结点A最为根结点,利用Prim算法来生成该图的最小生成树T的过程如下:
(1)开始T为空,初始化minidistance[A] = minidistance[B] = minidistance[C] = minidistance[D] = minidistance[E] = ∞ {\infty} ,miniadj[A] = A,miniadj[B] = B, miniadj[C] = C,miniadj[D] = D,miniadj[E] = E;

(2)将结点A加入T,这时minidistance[A] = 0,miniadj[A] = A, minidistance[B] = 6,miniadj[B] = A ,minidistance[C] = 1,miniadj[C] = A , minidistance[D] = 4,miniadj[D] = A , minidistance[E] = 4,miniadj[E] = A 。

(3)此时结点B,C,D,E都不在树T中,在连接树T结点和图G中树A以外的结点的所有边中,权重最小的边是minidistance[C],且miniadj[C]=A,所以将结点C和结点C与结点A连成的边加入树T。此时,minidistance[A] = 0,miniadj[A] = A, minidistance[B] = 6,miniadj[B] = A ,minidistance[C] = 0,miniadj[C] = A , minidistance[D] = 4,miniadj[D] = A , minidistance[E] = 4,miniadj[E] = A 。

(4)此时结点B,D,E都不在树T中,在连接树T结点和图G中树A以外的结点的所有边中,权重最小的边是minidistance[D]和minidistance[E],从中随便选一个,此处选结点D,且miniadj[D]=A,所以将结点D和结点D与结点A连成的边加入树T。此时,minidistance[A] = 0,miniadj[A] = A, minidistance[B] = 2,miniadj[B] = D ,minidistance[C] = 0,miniadj[C] = A , minidistance[D] = 0,miniadj[D] = A , minidistance[E] = 4,miniadj[E] = A 。

(5)此时结点B,E都不在树T中,在连接树T结点和图G中树A以外的结点的所有边中,权重最小的边是minidistance[B],且miniadj[B]=D,所以将结点B和结点B与结点D连成的边加入树T。此时,minidistance[A] = 0,miniadj[A] = A, minidistance[B] = 0,miniadj[B] = D ,minidistance[C] = 0,miniadj[C] = A , minidistance[D] = 0,miniadj[D] = A , minidistance[E] = 2,miniadj[E] = B。

(6)此时只有结点E都不在树T中,因此在连接树T结点和图G中树A以外的结点的所有边中,权重最小的边是minidistance[E],且miniadj[E]=B,所以将结点E和结点E与结点B连成的边加入树T,此时最小生成树构成,如下图所示:
在这里插入图片描述

2.1.2 代码实现

#define Maximum 1000
#define Biggest 100000000typedef struct EdgeListNode{int adjId;int weight;EdgeListNode* next;
};typedef struct VertexListNode{int data;EdgeListNode* firstadj;
};typedef struct GraphAdjList{int vertexnumber;int edgenumber;VertexListNode vertextlist[Maximum];
};typedef struct MiniTreeEdge {int s;int e;int weight;MiniTreeEdge *next;
};typedef struct MiniTree {  //最小生成树MiniTreeEdge *head;  //指向最小生成树的根节点int vertextnumber;
};void MiniSpanTree_Prim(GraphAdjList g, MiniTree tree, int start_node) {tree.head = NULL;int *distance = (int*)malloc(sizeof(int) * g.vertexnumber + 2);int *miniadj = (int*)malloc(sizeof(int) * g.vertexnumber + 2);int i, j, k, lastnode, thisnode;lastnode = start_node;for(i=1; i<=g.vertexnumber; i++) {distance[i] = Biggest;miniadj[i] = i;}distance[start_node] = 0;tree.vertextnumber = 1;while(tree.vertextnumber < g.vertexnumber) {EdgeListNode *temp = g.vertextlist[lastnode].firstadj;while(temp != NULL) {j = temp->adjId;if(distance[j] && distance[j]>temp->weight) {distance[j] = temp->weight;miniadj[j] = lastnode;}temp = temp->next;}k = Biggest;for(i=1; i<=g.vertexnumber; i++) {if(distance[i] && k>distance[i]) {k = distance[i];thisnode = i;}}MiniTreeEdge *temp1 = (MiniTreeEdge*)malloc(sizeof(MiniTreeEdge));temp1->e = thisnode; //新加入的结点temp1->s = miniadj[thisnode]; //最小生成树中与新加入结点相连的结点temp1->weight = k; //新加入的边的权重temp1->next = NULL;temp1->next = tree.head;tree.head = temp1;distance[thisnode] = 0;lastnode = thisnode;tree.vertextnumber++;}//打印最小生成树MiniTreeEdge *e = tree.head;while(e != NULL) {cout<<e->s<<" -> "<<e->e<<"  :  "<<e->weight<<endl;e = e->next;}}

2.1.3 测试

测试的图为:
在这里插入图片描述

int main() {GraphAdjList g;g.edgenumber = 5;g.vertexnumber = 4;int i, j, k;EdgeListNode *temp;for(i=1; i<=4; i++) {g.vertextlist[i].data = i;g.vertextlist[i].firstadj = NULL;}temp = (EdgeListNode*)malloc(sizeof(EdgeListNode));temp->adjId = 2; temp->weight = 2; temp->next = g.vertextlist[1].firstadj;g.vertextlist[1].firstadj = temp;temp = (EdgeListNode*)malloc(sizeof(EdgeListNode));temp->adjId = 4; temp->weight = 8; temp->next = g.vertextlist[1].firstadj;g.vertextlist[1].firstadj = temp;temp = (EdgeListNode*)malloc(sizeof(EdgeListNode));temp->adjId = 1; temp->weight = 2; temp->next = g.vertextlist[2].firstadj;g.vertextlist[2].firstadj = temp;temp = (EdgeListNode*)malloc(sizeof(EdgeListNode));temp->adjId = 3; temp->weight = 3; temp->next = g.vertextlist[2].firstadj;g.vertextlist[2].firstadj = temp;temp = (EdgeListNode*)malloc(sizeof(EdgeListNode));temp->adjId = 4; temp->weight = 1; temp->next = g.vertextlist[2].firstadj;g.vertextlist[2].firstadj = temp;temp = (EdgeListNode*)malloc(sizeof(EdgeListNode));temp->adjId = 2; temp->weight = 3; temp->next = g.vertextlist[3].firstadj;g.vertextlist[3].firstadj = temp;temp = (EdgeListNode*)malloc(sizeof(EdgeListNode));temp->adjId = 4; temp->weight = 5; temp->next = g.vertextlist[3].firstadj;g.vertextlist[3].firstadj = temp;temp = (EdgeListNode*)malloc(sizeof(EdgeListNode));temp->adjId = 1; temp->weight = 8; temp->next = g.vertextlist[4].firstadj;g.vertextlist[4].firstadj = temp;temp = (EdgeListNode*)malloc(sizeof(EdgeListNode));temp->adjId = 2; temp->weight = 1; temp->next = g.vertextlist[4].firstadj;g.vertextlist[4].firstadj = temp;temp = (EdgeListNode*)malloc(sizeof(EdgeListNode));temp->adjId = 3; temp->weight = 5; temp->next = g.vertextlist[4].firstadj;g.vertextlist[4].firstadj = temp;MiniTree tree;MiniSpanTree_Prim(g, tree, 1);MiniTreeEdge *e = tree.head;while(e != NULL) {cout<<e->s<<" -> "<<e->e<<"  :  "<<e->weight<<endl;e = e->next;}return 0;
}

2.2 Kruskal算法

2.2.1 基本思想

假设现在要求无向连通图G=(V, E)的最小生成树T,Kruskal算法的思想是令T的初始状态为|V|个结点而无边的非连通图,T中的每个顶点自成一个连通分量。接着,每次从图G中所有两个端点落在不同连通分量的边中,选取权重最小的那条,将该边加入T中,如此往复,直至T中所有顶点都在同一个连通分量上。

注意
此处的关键点有两个:
(1)在生成最小生成树前,要对图中的所有边进行排序;
(2)如何判断一条边的两个端点是否落在不同的连通分量上:
这里可以用一个数组parent来记录每个端点在其所在连通图中的父端点(例如parent[i]表示端点i的父端点),在一个连通分量中,总有一个端点的父端点是它自己(把它看成是一棵树的根节点)。
1)开始的时候初始化该数组为parent[i]=i(因为每个端点所在的连通图只有自己);
2)每次要判断一条边(u, v)的两个端点是否在在不同的连通分量上,就找端点u和端点v在它们所在的连通图中的最底层的父端点,具体的方法是递归地找端点k的父端点,直至某个端点的父端点等于它自己:

int find_parent(int node, int *parent) { //找端点node的最底层父端点while(parent[node] != node) {node = parent[node];}return node;
}

3)假设n=find_parent(u, parent),m=find_parent(v, parent),那么就要对它们进行判断:
如果n==m,说明结点u和结点v在一个连通分量上,因此不能将其加入T;
如果n!=m,说明结点u和结点v不在一个连通分量上,这时可以将(u,v)加入T,且令parent[n]=m(或parent[m]=n)。

例子
仍然以上述这个无向连通图G为例,它有5个顶点,7条边,如下图所示。
在这里插入图片描述
利用Prim算法来生成该图的最小生成树T的过程如下:
(1)先对图中的所有边按照权重递增的顺序排序:
(A, C, 1) , (B, D, 2) , (B, E, 2) , (A, D , 4) , (A, E , 4) , (A, B, 6) , (C, D, 8).
对每个端点的parent进行初始化:
parent[A] = A, parent[B] = B, parent[C] = C, parent[D] = D, parent[E] = E.

(2)从权重最短的边开始遍历:
1)(A, C, 1),因为parent[A] != parent[C],所以将边(A, C)加入树T,且令parent[parent[C]]=parent[A]=A.此时,parent[A] = A, parent[B] = B, parent[C] = A, parent[D] = D, parent[E] = E,此时T中有1条边。

2)(B, D, 2),因为parent[B] != parent[D],将边(B, D)加入树T,且令parent[parent[D]]=parent[B]=B.此时,parent[A] = A, parent[B] = B, parent[C] = A, parent[D] = B, parent[E] = E,此时T中有2条边.

3)(B, E, 2),因为parent[B] != parent[E],将边(B, E)加入树T,且令parent[parent[E]]=parent[B]=B.此时,parent[A] = A, parent[B] = B, parent[C] = A, parent[D] = B, parent[E] = B,此时T中有3条边

4)(A, D, 2),因为parent[A] != parent[D],将边(A, D)加入树T,且令parent[parent[D]]=parent[A]=A.此时,parent[A] = A, parent[B] = A, parent[C] = A, parent[D] = B, parent[E] = E,此时T中有4条边,正好等于端点数减一,因此树T生成。

2.2.2 具体实现

#define Maximum 1000
#define Biggest 100000000typedef struct EdgeListNode{int adjId;int weight;EdgeListNode* next;
};typedef struct VertexListNode{int data;EdgeListNode* firstadj;
};typedef struct GraphAdjList{int vertexnumber;int edgenumber;VertexListNode vertextlist[Maximum];
};typedef struct MiniTreeEdge {int s;int e;int weight;MiniTreeEdge *next;
};typedef struct MiniTree {MiniTreeEdge *head;int edgenumber;
};typedef struct EdgeArrayData {int l;int r;int weight;
};bool compare(EdgeArrayData a, EdgeArrayData b) {return a.weight < b.weight;
}int find_parent(int node, int *parent) {while(parent[node] != node) {node = parent[node];}return node;
}void  MiniSpanTree_Kruskal(GraphAdjList g, MiniTree *tree) {int i, j, k, edge_index, *parent;MiniTreeEdge *e;EdgeArrayData *edge = (EdgeArrayData*)malloc(sizeof(EdgeArrayData)*(g.edgenumber+2));parent = (int*)malloc(sizeof(int)*(g.vertexnumber+2));tree = (MiniTree*)malloc(sizeof(MiniTree));EdgeListNode *v;//将图中的每条边存储在edge里edge_index = 0;for(i=1; i<=g.vertexnumber; i++) {v = g.vertextlist[i].firstadj;parent[i] = i;while(v != NULL) {if(v->adjId > i) {  //为了避免将一条边存两次edge[edge_index].l = i;edge[edge_index].r = v->adjId;edge[edge_index].weight = v->weight;edge_index++;}v = v->next;}}sort(edge, edge+edge_index, compare); //将边按权重从小到大排序tree->edgenumber = 0;tree->head = NULL;for(i=0; i<edge_index; i++) {j = find_parent(edge[i].l, parent); k = find_parent(edge[i].r, parent);if(j != k) {parent[j] = k;e = (MiniTreeEdge*)malloc(sizeof(MiniTreeEdge));e->s = edge[i].l;e->e = edge[i].r;e->weight = edge[i].weight;e->next = tree->head;tree->head = e;tree->edgenumber++;}if(tree->edgenumber == g.vertexnumber - 1) {break;}}MiniTreeEdge *ee = tree->head;while(ee != NULL) {cout<<ee->s<<" -> "<<ee->e<<"  :  "<<ee->weight<<endl;ee = ee->next;}
}

2.2.3 测试

测试的图为:
在这里插入图片描述


int main() {GraphAdjList g;g.edgenumber = 5;g.vertexnumber = 4;int i, j, k;EdgeListNode *temp;for(i=1; i<=4; i++) {g.vertextlist[i].data = i;g.vertextlist[i].firstadj = NULL;}temp = (EdgeListNode*)malloc(sizeof(EdgeListNode));temp->adjId = 2; temp->weight = 2; temp->next = g.vertextlist[1].firstadj;g.vertextlist[1].firstadj = temp;temp = (EdgeListNode*)malloc(sizeof(EdgeListNode));temp->adjId = 4; temp->weight = 8; temp->next = g.vertextlist[1].firstadj;g.vertextlist[1].firstadj = temp;temp = (EdgeListNode*)malloc(sizeof(EdgeListNode));temp->adjId = 1; temp->weight = 2; temp->next = g.vertextlist[2].firstadj;g.vertextlist[2].firstadj = temp;temp = (EdgeListNode*)malloc(sizeof(EdgeListNode));temp->adjId = 3; temp->weight = 3; temp->next = g.vertextlist[2].firstadj;g.vertextlist[2].firstadj = temp;temp = (EdgeListNode*)malloc(sizeof(EdgeListNode));temp->adjId = 4; temp->weight = 1; temp->next = g.vertextlist[2].firstadj;g.vertextlist[2].firstadj = temp;temp = (EdgeListNode*)malloc(sizeof(EdgeListNode));temp->adjId = 2; temp->weight = 3; temp->next = g.vertextlist[3].firstadj;g.vertextlist[3].firstadj = temp;temp = (EdgeListNode*)malloc(sizeof(EdgeListNode));temp->adjId = 4; temp->weight = 5; temp->next = g.vertextlist[3].firstadj;g.vertextlist[3].firstadj = temp;temp = (EdgeListNode*)malloc(sizeof(EdgeListNode));temp->adjId = 1; temp->weight = 8; temp->next = g.vertextlist[4].firstadj;g.vertextlist[4].firstadj = temp;temp = (EdgeListNode*)malloc(sizeof(EdgeListNode));temp->adjId = 2; temp->weight = 1; temp->next = g.vertextlist[4].firstadj;g.vertextlist[4].firstadj = temp;temp = (EdgeListNode*)malloc(sizeof(EdgeListNode));temp->adjId = 3; temp->weight = 5; temp->next = g.vertextlist[4].firstadj;g.vertextlist[4].firstadj = temp;MiniTree *tree;MiniSpanTree_Kruskal(g, tree);MiniTreeEdge *e = tree->head;while(e != NULL) {cout<<e->s<<" -> "<<e->e<<"  :  "<<e->weight<<endl;e = e->next;}return 0;
}

http://chatgpt.dhexx.cn/article/a6Yttqbn.shtml

相关文章

最小生成树的Kruskal算法-详解

最小生成树的Kruskal算法 一、 什么是最小生成树 1.1 最小生成树定义&#xff1a; 一个有 n 个结点的连通图的生成树是原图的极小连通子图&#xff0c;且包含原图中的所有 n 个结点&#xff0c;并且有保持图连通的最少的边。最小生成树可以用kruskal&#xff08;克鲁斯卡尔&a…

最小生成树(C语言简单实现)

最小生成树 本文参考自《大话数据结构》 一个连通图的生成树是一个极小的连通子图&#xff0c;它含有图中全部的顶点&#xff0c;但只有足以构成一棵树的n-1条边。我们把构造连通网的最小代价生成树称为最小生成树 。 找连通网的最小生成树&#xff0c;经典的有两种算法&#…

最小生成树怎么画?

介绍最小生成树的图形画法~以下图为例&#xff1a; 1、从1开始&#xff0c;以1为顶点画圈。在红色线经过的部分中&#xff0c;可见权重分别为6、1、5&#xff0c;最小权重为1。如下图。 2、以上图中得到的1、3为顶点的图中&#xff0c;继续画线&#xff0c;图为黄色线部分。经过…

最小生成树算法

最小生成树算法 生成树的概念最小生成树算法Prim算法Kruskal算法 生成树的概念 若图是连通的无向图或强连通的有向图&#xff0c;则从其中任一顶点出发&#xff0c;调用一次 d f s dfs dfs或者 b f s bfs bfs后&#xff0c;可以系统的访问图中所有顶点。若图是有根的有向图 &a…

【图】最小生成树

最小生成树&#xff1a;构造连通网的最小代价生成树。 最小生成树有两种算法&#xff1a;普利姆算法、克鲁斯卡尔算法。 普利姆&#xff08;Prim&#xff09;算法 加点&#xff0c;选择相邻点中边权最小的 需要两个一维数组&#xff0c;一个存权值&#xff0c;另一个存起始点…

最小生成树-Kruskal算法

数据结构:最小生成树-Kruskal算法 什么是最小生成树&#xff0c;最小生成树就是求图中把所有点都访问到的最短路径的长度 Kruskal算法采用的是边贪心思想&#xff0c;我们先大概讲一下它的大概思想&#xff0c;首先我们先假设先隐藏所有的边&#xff0c;这样每个点会成为一个连…

最小生成树(kruskal算法)

一、概述 最小生成树问题顾名思义&#xff0c;概括来说就是路修的最短。 接下来引入几个一看就明白的定义&#xff1a; 最小生成树相关概念&#xff1a; 带权图&#xff1a;边赋以权值的图称为网或带权图&#xff0c;带权图的生成树也是带权的&#xff0c;生成树T各边的权值…

最小生成树、最短路径树

一、最小生成树与最短路径树的区别 最小生成树能够保证整个拓扑图的所有路径之和最小&#xff0c;但不能保证任意两点之间是最短路径。 应用如网络部线&#xff0c;把所有的电脑(服务器&#xff1f;&#xff09;都连起来用的网线(光纤&#xff1f;&#xff09;最少&#xff0c…

【图解算法】最小生成树

今天我们介绍图论中的另一部分&#xff0c;最小生成树。 对图的最短路感兴趣的同学可以看&#xff1a; 【图解算法】一次解决最短路径问题 目录 1. 最小生成树简介2. Prim算法2.1 模板题2.2 思路模板2.3 代码实现2.3 prim 算法的优化 3. Kruskal算法3.1 模板题3.2 思路模板3.3…

数据结构—最小生成树

目录 一、生成树 二、最小生成树&#xff08;代价最小树&#xff09; 三、求最小生成树 1、Prim算法&#xff08;普里姆&#xff09; 2.Kruskal 算法&#xff08;克鲁斯卡尔&#xff09; 3.Prim算法和Kruskal算法对比 一、生成树 连通图的生成树是包含图中全部顶点的一个…

最小生成树详解

目录 最小生成树简介 什么是树 什么是生成树 什么是最小生成树 最小生成树的做法 Kruscal&#xff08;克鲁斯卡尔&#xff09;算法 思路 代码 其他算法 最小生成树简介 什么是树 树&#xff08;tree&#xff09;是一种特殊的图&#xff0c;一个图要成为树要满足三个条…

最小生成树的实现(C语言)

今天做洛谷的时候刷到好多图论的题&#xff0c;发现自己在这一方面算法的掌握还是有待提高啊。在这就先介绍最小生成树的算法吧。 最小生成树 最小生成树&#xff08;minimum spanning tree&#xff09;是由n个顶点&#xff0c;n-1条边&#xff0c;将一个连通图连接起来&…

详解: 最小生成树

详解: 最小生成树算法 最小生成树&#xff08;Minimum Spanning Tree, MST&#xff09;是在一个给定的无向图G(V, E)中求一棵树&#xff0c;使得这棵树有图G的所有顶点&#xff0c;且所有边都来自图G中的边&#xff0c;并且满足整棵树的边权之和最小. 最下生成树满足如下性质…

最小生成树

目录 一、最小生成树定义&#xff1a; 二、普里姆算法&#xff08;Prim&#xff09; 三、Kruskal算法&#xff08;克鲁斯卡尔&#xff09; 小结&#xff1a; 下一篇&#xff1a;最短路径算法 问题&#xff1a; 一、最小生成树定义&#xff1a; 对于一个带权连通无向图G(V,E)&am…

最小生成树——Prim算法(详细图解)

目录 最小生成树的概念 经典题目 prim算法简介 prim算法解析 &#xff08;详细图解&#xff09; 代码实现 代码实战 最小生成树的概念 在一给定的无向图G (V, E) 中&#xff0c;(u, v) 代表连接顶点 u 与顶点 v 的边&#xff0c;而 w(u, v) 代表此的边权重&#xff0c;若…

最小生成树入门(图解)

1.什么是最小生成树 来看百度百科的定义 一个有 n 个结点的连通图的生成树是原图的极小连通子图&#xff0c;且包含原图中的所有 n个结点&#xff0c;并且有保持图连通的最少的边。最小生成树可以用kruskal&#xff08;克鲁斯卡尔&#xff09;算法或prim&#xff08;普里姆&am…

最小生成树(Prim、Kruskal)算法,秒懂!

前言 在数据结构与算法的图论中&#xff0c;(生成)最小生成树算法是一种常用并且和生活贴切比较近的一种算法。但是可能很多人对概念不是很清楚&#xff0c;什么是最小生成树? 一个有 n 个结点的连通图的生成树是原图的极小连通子图&#xff0c;且包含原图中的所有 n 个结点&…

最小生成树详解(模板 + 例题)

作为一个伪ACMer,先来首广为人知的打油诗: 模拟只会猜题意&#xff0c;贪心只能过样例&#xff0c;数学上来先打表&#xff0c;规律一般是DP&#xff0c;组合数学碰运气&#xff0c;计算几何瞎暴力&#xff0c;图论一顿套模板&#xff0c;数论只会GCD,递归递推伤不起&#xff0…

Linux开启/关闭防火墙

一、查看防火墙状态&#xff1a; systemctl status firewalldinactive表示防火墙为关闭状态。 二、开启防火墙&#xff1a; systemctl start firewalld启动后无任何提示&#xff0c;再次查看防火墙状态&#xff0c;可以看到变成active&#xff0c;成功启动。 三、关闭防火墙…

linux服务器查看防火墙是否关闭,linux查看防火墙是否关闭了的方法

linux查看防火墙是否关闭了的方法 发布时间&#xff1a;2020-04-02 10:49:28 来源&#xff1a;亿速云 阅读&#xff1a;62 作者&#xff1a;小新 今天小编给大家分享的是linux查看防火墙是否关闭了的方法&#xff0c;很多人都不太了解&#xff0c;今天小编为了让大家更加了解li…