找出无向图的割点

割点是将其删除后会破坏图连通性的顶点,割点存在表示该图不是双连通的。

#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

猜你喜欢

转载自blog.csdn.net/qq_18431031/article/details/108273740
今日推荐