序文
画像のトラバーサル、hahahaは実際には非常に迅速に行われました。今日のコードを最初にコード化して、明日の穴を埋めることができます。
タイトル
N個の頂点とE個のエッジを持つ無向グラフを前提として、DFSとBFSを使用して、接続されているすべてのセットを一覧表示します。頂点に0からN-1までの番号が付けられているとします。検索を実行するときは、常に最も番号の小さい頂点から開始し、番号の昇順で隣接するポイントを訪問すると想定されています。
入力フォーマット
最初の行を入力すると、2つの整数N(0 <N≤10)とEが与えられます。これらはそれぞれ、グラフの頂点とエッジの数です。次に、ラインEで、各ラインはエッジの2つの端点を示します。各行の番号は1スペースで区切られます。
出力フォーマット
"{ 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 }
アイデア
達成する
完全なコード
#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;
}