7-6 列出连通集

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Authur520/article/details/85052183

给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N−1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。

输入格式:

输入第1行给出2个整数N(0<N≤10)和E,分别是图的顶点数和边数。随后E行,每行给出一条边的两个端点。每行中的数字之间用1空格分隔。

输出格式:

按照"{ v​1​​ v​2​​ ... v​k​​ }"的格式,每行输出一个连通集。先输出DFS的结果,再输出BFS的结果。

输入样例:

8 6
0 7
0 1
2 0
4 1
2 4
3 5

输出样例:

{ 0 1 4 2 7 }
{ 3 5 }
{ 6 }
{ 0 1 2 7 4 }
{ 3 5 }
{ 6 }

代码实现为:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define MAXN 15
#define TRUE 1
#define FALSE 0
typedef int Vertex;         /* 用顶点下标表示顶点,为整型 */

int Nv,Ne;
int G[MAXN][MAXN];
Vertex Visited[MAXN] = {FALSE};

void BuildGraph();
void DFS(Vertex V);
void BFS (Vertex S);

int main()
{
	Vertex W;
	
	BuildGraph();
	for(W=0; W<Nv; W++){
		if( !Visited[W] ){//若W顶点未被访问过
			printf("{ ");
			DFS(W);
			printf("}\n");
		}
	}
	memset(Visited,0,sizeof(Visited));
	for(W=0; W<Nv; W++){
		if( !Visited[W] ){//若W顶点未被访问过
			printf("{ ");
			BFS(W);
			printf("}\n");
		}
	}
	
	return 0;
}

void BuildGraph()
{
	int i,j;
	int v1,v2;
	
	scanf("%d",&Nv);
	for(i=0; i<Nv; i++)
	    for(j=0; j<Nv; j++)
	    	G[i][j] = 0;
	scanf("%d",&Ne);
	for(i=0; i<Ne; i++){
		scanf("%d %d",&v1,&v2);
		G[v1][v2] = 1;
		G[v2][v1] = 1;
	}
}

void DFS(Vertex V)
{/* 以V为出发点对邻接矩阵存储的图G进行DFS搜索 */
    Vertex W;
     
    printf("%d ", V); /*访问第V个顶点 */
    Visited[V] = TRUE; /*标记V已访问 */
    
    for(W=0; W<Nv; W++){
    	if( G[V][W] != 0){  /* 对V的每个邻接点W */
    		if( !Visited[W] ){  //若W未被访问过
    			DFS(W);      /* 则递归访问之 */
			} 
		}
	}
}

void BFS (Vertex S)
{   /*以S为出发点对邻接矩阵存储的图G进行BFS搜索 */
    Vertex V, W;
    Vertex s[MAXN];  //顶点队列
	int head = 0,tail = 0; 
    
    printf("%d ", S); /*访问第V个顶点 */
    Visited[S] = TRUE; /* 标记S已访问 */
    s[tail++] = S;
     
    while ( head < tail ) {  //队列不为空时 
        V = s[head++];  /* 弹出V */
        for(W=0; W<Nv; W++) /* 对图中的每个顶点W */
            /* 若W是V的邻接点并且未访问过 */
            if ( !Visited[W] && G[V][W] ){
                /* 访问顶点W */
                printf("%d ", W); /*访问第V个顶点 */
                Visited[W] = TRUE; /* 标记W已访问 */
                s[tail++] = W; /* W入队列 */
            }
    } /* while结束*/
}

猜你喜欢

转载自blog.csdn.net/Authur520/article/details/85052183