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 "{ v1 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;
}