接続されたセットのリスト(グラフのトラバーサル)

序文

画像のトラバーサル、hahahaは実際には非常に迅速に行われました。今日のコードを最初にコード化して、明日の穴を埋めることができます。

タイトル

N個の頂点とE個のエッジを持つ無向グラフを前提として、DFSとBFSを使用して、接続されているすべてのセットを一覧表示します。頂点に0からN-1までの番号が付けられているとします。検索を実行するときは、常に最も番号の小さい頂点から開始し、番号の昇順で隣接するポイントを訪問すると想定されています。

入力フォーマット

最初の行を入力すると、2つの整数N(0 <N≤10)とEが与えられます。これらはそれぞれ、グラフの頂点とエッジの数です。次に、ラインEで、各ラインはエッジの2つの端点を示します。各行の番号は1スペースで区切られます。

出力フォーマット

"{ v​1 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 }

アイデア

達成する

完全なコード

#include<iostream>
using namespace std;

const int MaxSize = 11;
int visit[MaxSize] = { 0, };
//邻接矩阵存储图:一个顶点结构存储顶点的相关信息,一个主体结构存储图的信息
//在本题中,因为不需要多余的顶点信息,所以把顶点的结构简化了


typedef struct {
	int edges[MaxSize][MaxSize];
	int n, e;
}MGraph;

//总是从最小的顶点出发,那就是从0出发进行遍历
void myInput(MGraph &g);
void myBFS(MGraph g);
void myDFS(MGraph g);
void myDFS_visit(MGraph g, int p);

int main() {
	MGraph G;
	int N, E;
	cin >> N >> E;
	G.n = N;
	G.e = E;
	for (int i = 0; i < N; i++)			//初始化
		for (int j = 0; j < N; j++) 
			G.edges[i][j] = -1;
	myInput(G);
	myDFS(G);
	for (int i = 0; i < MaxSize; i++)
		visit[i] = 0;
	myBFS(G);
	return 0;
}

void myInput(MGraph &g) {
	for (int i = 0; i < g.e; i++) {
		int v1, v2;
		cin >> v1 >> v2;
		g.edges[v1][v2] = g.edges[v2][v1] = 1;
	}
}

void myBFS(MGraph g) {			//用矩阵可以更好的实现从小到大访问
	int queue[MaxSize];
	int front, rear;
	front = rear = -1;
	for (int i = 0; i < g.n; i++) {
		if (visit[i] == 0) {
			cout << "{ " << i <<" ";
			queue[++rear] = i;			//最小元素入队
			visit[i] = 1;						//0已经访问过了
			while (front != rear) {
				int p = queue[++front];
				for (int j = i; j < g.n; j++)
					if (g.edges[p][j] == 1 && visit[j] == 0) { 		//联通的且未访问过的,入栈
						queue[++rear] = j;
						cout << j << " ";
						visit[j] = 1;
					}
			}
			cout << "}\n";
		}
	}
	return;
}

void myDFS(MGraph g) {
	for (int i = 0; i < g.n; i++) 
		if (visit[i] == 0) {
			cout << "{ ";
			myDFS_visit(g, i);
			cout << "}\n";
		}
	return;
}

void myDFS_visit(MGraph g, int p) {
	cout << p << " ";
	visit[p] = 1;
	for (int i = 0; i < g.n; i++) 
		if (g.edges[p][i] == 1 && visit[i] == 0) 
			myDFS_visit(g, i);
	return;
}

おすすめ

転載: www.cnblogs.com/Za-Ya-Hoo/p/12748946.html