割点是将其删除后会破坏图连通性的顶点,割点存在表示该图不是双连通的。
#include <queue>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 100;
int Counter;
bool visited[maxn], isArt[maxn];
int Num[maxn], Low[maxn];
int parent[maxn];
// 邻接表
typedef struct edge_node // 边结点
{
int adj_end; // adjlist的数组下标(0开始) /* /adj_end 0[][] -> (*frist_vertex) [][]->[][] */
struct edge_node *next_edge; /* / adj_end 1[][] -> (*frist_vertex) [][]->[][] */
} edgenode; /* adjlist */
/* \ adj_end 2[][] -> (*frist_vertex) [][]->[][] */
typedef struct //邻接表头结点 /* \adj_end 3[][] -> (*frist_vertex) [][]->[][] */
{
int data;
edgenode *frist_vertex; // adjlist中第一个指向下一个结点的指针
} head_node;
typedef struct // 邻接表
{
int vertex, edge;
head_node adjlist[maxn];
} adjGraph;
void init_graph()
{
Counter = 1;
for (int i = 0; i < maxn; i++) {
visited[i] = false;
isArt[i] = false;
}
}
void create_graph(adjGraph & g, int vertex, int edge)
{
char s, x, y;
g.vertex = vertex;
g.edge = edge;
edgenode *p;
cout << "Enter vertex in graph:" << endl;
for (int i = 1; i <= vertex; i++) {
cin >> s;
g.adjlist[i].data = (s - 'A' + 1);
g.adjlist[i].frist_vertex = NULL;
}
cout << "Enter A to B in graph:" << endl;
for (int i = 1; i <= edge; i++) {
cin >> x >> y;
p = new edgenode;
p->adj_end = (y - 'A' + 1);
p->next_edge = g.adjlist[x - 'A' + 1].frist_vertex;
g.adjlist[x - 'A' + 1].frist_vertex = p;
p = new edgenode;
p->adj_end = (x - 'A' + 1);
p->next_edge = g.adjlist[y - 'A' + 1].frist_vertex;
g.adjlist[y - 'A' + 1].frist_vertex = p;
}
}
void findArt(adjGraph & g, char s)
{
int child = 0;
int snum = (s - 'A' + 1);
edgenode *p;
p = g.adjlist[snum].frist_vertex;
visited[snum] = true;
Low[snum] = Num[snum] = Counter++;
while (p) {
int pnum = p->adj_end;
if (!visited[pnum]) {
child++;
parent[pnum] = (s - 'A' + 1);
findArt(g, char(pnum - 1 + 'A'));
if (parent[snum] != 0 && Low[pnum] >= Num[snum] && !isArt[snum]) {
isArt[snum] = true;
cout << char(snum - 1 + 'A') << " is an articulation point." << endl;
}
else if (parent[snum] == 0 && child > 1) {
isArt[snum] = true;
cout << char(snum - 1 + 'A') << " is an articulation point." << endl;
}
Low[snum] = min(Low[snum], Low[pnum]);
}
else if (parent[snum] != char(pnum - 1 + 'A'))
Low[snum] = min(Low[snum], Num[pnum]);
p = p->next_edge;
}
}
int main()
{
int vertex, edge;
adjGraph g;
init_graph();
cout << "Enter the number of vertex and edge of graph:" << endl;
cin >> vertex >> edge;
create_graph(g, vertex, edge);
findArt(g, 'A');
return 0;
}
参考博客:https://blog.csdn.net/wy250229163/article/details/53769139