找出无向图的割点

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

#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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值