题目要求:
求一个有向连通图的割点。割点的定义是,如果除去此结点和与其相关的边,有向图不再连通,描述算法。
题目分析:
判断某个点是否是割点的方法是,删除该点和与其相关的边,然后求连通性;这样逐个删除点(每次有且只删除一个点),就可以判断该图的割点有哪些了。
判断图连通性的方法:从一个点出发,如果能遍历所有的点,则连通。
使用邻接表表示有向图:
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=删除一个点后的总点数时,则连通