06-图1 列出连通集 (25分)

课堂笔记

如果从无向图的任一顶点出发进行一次深度优先搜索可访问所有顶点,则该图一定是连通图。因为连通图只有一个连通分量,即只需从一个起点遍历一次就可以访问所有节点。

题目

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

输入格式:
输入第1行给出2个整数N(0

输出格式:
按照"{ v1,v2,…,vk}"的格式,每行输出一个连通集。先输出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 }

代码

建立图、DFS、BFS的基本操作

#include
#include
#include
#include
#define MAXN 15
using namespace std;
int visited[MAXN];
queue q;
typedef struct GNode *PtrToGNode;
struct GNode{
	int v;
	int e;
	int g[MAXN][MAXN];
};
typedef PtrToGNode MGraph;
MGraph CreateGraph(int n){
	int v,w;
	MGraph G;
	G=(MGraph)malloc(sizeof(struct GNode));
	G->v=n;
	G->e=0;
	for(v=0;vg[v][w]=0;
	return G;
}
MGraph BuildGraph(int n){
	MGraph G;
	int m,v1,v2;
	G=CreateGraph(n);
	cin>>m;
	G->e=m;
	for(int i=0;i>v1>>v2;
		G->g[v1][v2]=1;
		G->g[v2][v1]=1;
	}
	return G;
}
void DFS(MGraph G,int v){
	visited[v]=1;
	cout<v;i++){
		if(G->g[v][i]&&!visited[i])
		DFS(G,i);
	}
}
void DFSL(MGraph G){
	for(int i=0;iv;i++){
	if(!visited[i]){
		cout<<"{ ";
		DFS(G,i);
		cout<<"}"<v;i++){
		if(G->g[v][i]&&!visited[i]){
			visited[i]=1;
	        q.push(i);
		}
	  }
    }
}
void BFSL(MGraph G){
	for(int i=0;iv;i++){
	if(!visited[i]){
		cout<<"{ ";
		BFS(G,i);
		cout<<"}"<>n;
	G=BuildGraph(n);
	memset(visited,0,sizeof(visited));
	DFSL(G);
	memset(visited,0,sizeof(visited));
	BFSL(G);
	return 0;
}

你可能感兴趣的:(06-图1 列出连通集 (25分))