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

来源:互联网 发布:湖南软件开发 编辑:程序博客网 时间:2024/05/28 05:13

题目要求:

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

题目分析:

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

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

  使用邻接表表示有向图:

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=删除一个点后的总点数时,则连通


0 0