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

来源:互联网 发布:国外大数据最牛公司 编辑:程序博客网 时间:2024/05/16 12:03

基础定义

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

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

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:这个代码是自己想着加的,也不知道对不对。若果不对,希望小伙伴们帮我指出来。

原创粉丝点击