数据结构---图(求关节点)

来源:互联网 发布:绝对领域 知乎 编辑:程序博客网 时间:2024/04/19 06:17
// Find Articulation Point.cpp : Defines the entry point for the console application./*-----CODE FOR FUN----------------------CREATED BY Dream_Whui-------------2015-2-13--------------------*/#include "stdafx.h"#include "graph.h"int COUNT;int low[MAX_VERTEX_NUM];void DFSArticul(ALGraph G, int v0)//从第v0个顶点出发深度优先遍历图G,查找并输出 关节点{    int w,min;    visited[v0] = min = ++COUNT;//v0是第count个访问的顶点    ArcNode *p;    for(p=G.vertices[v0].firstarc; p!=NULL; p=p->nextarc)//对v0的每个邻接顶点检查    {        w = p->adjvex;        //w为V0的邻接顶点        if(visited[w] == 0)    //w未曾访问,是v0的孩子        {            DFSArticul(G,w);//返回前求得low[w]            if(low[w] < min)                min = low[w];            if(low[w] >= visited[v0])                cout<<v0<<" "<<G.vertices[v0].data<<endl;        }        else            if(visited[w] < min)//w已访问,w是v0在生成树上的祖先                min = visited[w];    }    low[v0] = min;    cout<<G.vertices[v0].data<<" "<<min<<endl;}void FindArticul(ALGraph G)//连通图G以邻接表作存储结构,查找并输出G上的全部关节点,全局量count{    int i,v;    COUNT = 1;                //设定邻接表上0号顶点为生成树的根    visited[0] = 1;            //其余顶点尚未访问    for(i=1; i<G.vexnum; i++)        visited[i] = 0;    ArcNode *p;    p = G.vertices[0].firstarc;    v = p->adjvex;    DFSArticul(G,v);        //从第v个顶点出发深度优先查找关节点    if(COUNT < G.vexnum)    //生成树的根有至少两颗子树    {        cout<<0<<" "<<G.vertices[0].data<<endl;//根是关节点,输出        while(p->nextarc)        {            p = p->nextarc;            v = p->adjvex;            if(visited[v] == 0)                DFSArticul(G,v);        }    }}int main(int argc, char* argv[]){    ALGraph G;    CreateGraph(G);    Display(G);    FindArticul(G);    return 0;}

0 0
原创粉丝点击