通过DFS和BFS判断无向图是否连通

基础定义

无向图:没有方向的图
连通图:任意两个顶点可以直接或者通过其他顶点走通,那么就是连通图,和完全图需要区别(完全图是需要任意两个顶点直接有路)

遍历图的基本方法来判断是否连通

DFS和BFS有的步骤都是从一个顶点开始,然后判断该顶点是否被访问,而且该顶点和其他顶点是否有关系,若有关系并且没有访问过,就往下访问,要是无向图是连通的,那么这个过程会依次下去遍历所有节点。所以通过这个特性,就可以设置一个全局变量count去记录,看最后count的值和顶点数是否相同,若相同则说明是无向连通图,反之则不是。

int count = 0;
void DFS(MGrap G. int i)
{
    int j = 0;
    visited[i] = 1;
    count++;
    for(j=0; j<G.numVertexes; j++)
    {
        if(G.arc[i][j]==1 && !visited[j])//i和j有关系相邻,并且j顶点没有被访问过
        {
            DFS(G, j);
        }
    }
}
int count = 0;
void BFS(MGrap G)
{
    int i,j;
    Queue Q;
    for(i=0; i<G.numVertexes; i++)/*初始化访问数组*/
    {
        visited[i] = -1;
    }
    InitQueue(&Q);
    for(i=0; i<G.numVertexes; i++)
    {
        if(!visited[i])
        {
            visited[i] = 1;
            printf("%c",G.vexs[i]);
            EnQueue(&Q,i);/*入队操作*/
            while(!QueueEmpty(Q))
            {
                DeQueue(&Q, &i);
                for(j=0; j<G.numVertexes; j++)
                {
                    /* 判断当前的节点与其他节点的关系 */
                    if(G.arc[i][j]==1 && !visited[j])
                    {
                        if(i==0)/*首先遍历的节如果和其他边有关系的话要加上*/
                        {
                            count++;
                        }
                        visited[j] = 1;
                        count++;
                        EnQueue(&Q,j);
                    }
                }
            }
        }
    }
}


PS:这个代码是自己想着加的,也不知道对不对。若果不对,希望小伙伴们帮我指出来。

猜你喜欢

转载自blog.csdn.net/qq_36573828/article/details/78649859
今日推荐