Lista de conjuntos conectados (transversal del gráfico)

Prólogo

Al atravesar la imagen, jajaja en realidad se hizo tan rápido, puede ser, primero codifique el código hoy, llene el hueco mañana.

Titulo

Dado un gráfico no dirigido con N vértices y bordes E, use DFS y BFS para enumerar todos sus conjuntos conectados. Supongamos que los vértices están numerados de 0 a N − 1. Al realizar una búsqueda, se supone que siempre comenzamos desde el vértice con el número más bajo y visitamos los puntos adyacentes en orden creciente.

Formato de entrada

Al ingresar la primera línea se obtienen dos enteros N (0 <N≤10) y E, que son el número de vértices y bordes de la gráfica, respectivamente. Luego, en la línea E, cada línea da dos puntos finales de un borde. Los números en cada línea están separados por 1 espacio.

Formato de salida

Según "{ v​1 v2 ... vk }"el formato, cada línea emite un conjunto conectado. El resultado DFS se genera primero, seguido del resultado BFS.

Muestra

Muestra de entrada

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

Salida de muestra

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

Ideas

Lograr

Código completo

#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;
}

Supongo que te gusta

Origin www.cnblogs.com/Za-Ya-Hoo/p/12748946.html
Recomendado
Clasificación