图的遍历,哈哈哈居然这么快就做出来了,可以可以,今天先码代码,明天填坑。
给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N?1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。
输入第1行给出2个整数N(0<N≤10)和E,分别是图的顶点数和边数。随后E行,每行给出一条边的两个端点。每行中的数字之间用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;
}
原文:https://www.cnblogs.com/Za-Ya-Hoo/p/12748946.html