您的位置:首页 > 其它

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

2017-11-27 22:18 239 查看

基础定义

无向图:没有方向的图

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

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

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:这个代码是自己想着加的,也不知道对不对。若果不对,希望小伙伴们帮我指出来。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: