图的连通性和连通分量

1、无向图的连通性

运用深度优先搜索或广度优先搜索遍历无向图可以分析图的连通性。可通过额外设置计数器count(初始值0)统计出图的连通分量,每调用一次,计数器count增1。当遍历完无向图时,若count=1,则图连通,若count>1,图非连通,count的值就是该图的连通分量数。

图的连通性和连通分量_第1张图片

#include 
using namespace std;
#define INFINITY  65535 /* 表示权值的无穷*/
typedef int EdgeType;//边上的权值类型
typedef int VertexType;//顶点类型
const int MaxSize=100;
int visited[MaxSize];//全局标识数组
//无向图邻接表。边表结点结构
struct EdgeNode
{
    int adjvex;//邻接点域
    EdgeNode *next;//指向下一个边结点的指针
};
//无向图邻接表。表头结点结构
struct VexNode
{
    VertexType vertex;//顶点
    EdgeNode *firstedge;//边表的头指针
};
//邻接表类
class ALGraph
{
    public:
        ALGraph()//无参构造函数
        {
            vertexNum=0;
            edgeNum=0;
            for(int i=0;iadjvex=end;//邻接点
    //p->weight=weight;
    p->next=adjlist[start].firstedge;//前插法插入边结点p
    adjlist[start].firstedge=p;
}
//打印存储的图
void ALGraph::displayGraph(int nodeNum)
{
    int i,j;
    EdgeNode *p;
    for(i=0;iadjvex<<')'<next;
        }
     }
}
//从v出发深度优先遍历可达顶点递归函数
void ALGraph::DFSL(int v)
{
    int n=vertexNum;
    int j;
    EdgeNode *p;
    if(v>=n||v<0) throw "位置出错";
    cout<adjvex;//顶点
        if(visited[j]==0) DFSL(j);
        p=p->next;
    }
}
//从v出发深度优先遍历可达顶点的非递归函数
void ALGraph::DFSL1(int v)
{
    int S[MaxSize],top=-1,j,n=vertexNum;
    EdgeNode *p;
    if(v>=n||v<0) throw "位置出错";
    cout<adjvex;//顶点
            if(visited[j]==1) p=p->next;
            else
            {
                cout<
图的连通性和连通分量_第2张图片

2、有向图的连通性

求有向图的强连通分量,可以使用十字链表存储,利用深度优先非递归搜索遍历。

(1)在有向图G上,按出弧表深度优先非递归搜索遍历有向图G。

从某顶点v出发,沿以v为弧尾的弧进行深度优先非递归遍历,并对深度优先非递归搜索遍历算法修改,使被访问过的顶点(下标)入栈,按顶点(下标)退桟的次序将顶点顺序记录在另一个数组outstack[MaxSize]。若依次不能遍历完图中所有顶点,再任取下一个未被访问过的顶点出发遍历,重复上述,直到图中所有顶点被访问完。outstack设计为全局数组,全部顶点都记录在其中,其中顶点顺序和深度优先遍历顺序相反。

(2)统计连通分量数的计数器count置1。按入弧表对图进行深度优先非递归搜索遍历。取outstack最后的顶点,从该顶点出发,沿着以该顶点为弧头的弧做逆向(按入弧表)深度优先非递归比遍历。若此次不能遍历完图中顶点,则从余下的顶点中最后完成搜索遍历的顶点出发,即outstack中由后往前的未被访问顶点继续做逆向深度优先非递归遍历,直至有向图中所有顶点都被逆向深度优先遍历。每一次做逆向遍历,count增1。每一次逆向遍历所访问到的顶点就是一个强连通分量的顶点集,count是强连通分量数。

图的连通性和连通分量_第3张图片


你可能感兴趣的:(数据结构)