求一个有向连通图的割点 【微软面试100题 第三十九题】

本文详细阐述了如何通过邻接表表示有向图,并使用深度优先搜索(DFS)算法来判断图中是否存在割点。割点是指,如果移除此点及其相关边后,图将不再连通。文章提供了核心代码和步骤,帮助读者理解并实现这一算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目要求:

  求一个有向连通图的割点。割点的定义是,如果除去此结点和与其相关的边,有向图不再连通,描述算法。

题目分析:

  判断某个点是否是割点的方法是,删除该点和与其相关的边,然后求连通性;这样逐个删除点(每次有且只删除一个点),就可以判断该图的割点有哪些了。

  判断图连通性的方法:从一个点出发,如果能遍历所有的点,则连通。

  使用邻接表表示有向图:

typedef struct ArcNode
{
    int adjvex;
    struct ArcNode *next;
}ArcNode;
typedef struct
{
    char data;
    ArcNode *firstarc;
}AdjList;
typedef struct AlGraph
{
    AdjList vertices[MAX_VERTEX_NUM];
    int vexnum,arcnum;
    int kind;
}AlGraph;

 

//核心代码
AlGraph G;
bool Dfs(char s) { visit[s] = true; cnt++ if(cut==G.vexnum-1) return true; ArcNode *p = G.vertices[s]; for(;p;p->firstarc) { if(!visit[p->data]) Dfs[p->data]; } return false; }
//cut为全局变量,当cnt=删除一个点后的总点数时,则连通

  

转载于:https://www.cnblogs.com/tractorman/p/4079289.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值