在C程序中从1开始打印该图的按字典顺序最小的DFS。
我们将得到一个具有N个顶点和M个边的连接图。因此,我们必须从1开始打印该图的按字典顺序最小的DFS。
顶点应从1到N编号
示例
Input: N = 5 M =5 edge(1, 4, arr) edge(3, 4, arr) edge(5, 4, arr) edge(3, 2, arr) edge(1, 5, arr) edge(1, 2, arr) edge(3, 5, arr) edge(1, 3, arr) output: 1 2 3 4 5
首先,我们将对与每个顶点关联的边进行排序,而不是执行常规的DFS,以便在每个回合中仅首先选择最小的边。排序后,只需执行正常的DFS,这将提供字典上最小的DFS遍历。
下面给出的是下面给出的算法的C++实现。
算法
Start Step 1 -> Declare Function void lexo(vector<int>* arr, int n) Declare bool check[n + 1] = { 0 } Loop For int i=0 and i<n and i++ Call sort(arr[i].begin(), arr[i].end()) Loop For int i = 1 and i < n and i++ IF !check[i] Call graph(arr, i, n, check) End End Step 2 -> declare Function void edge(int u, int v, vector<int>* arr) Call ar[u].push_back(v) Call ar[v].push_back(u) Step 3 -> Declare function void graph(vector<int>* arr, int src, int n,bool* check) print src Set check[src] = true Loop for int i = 0 and i < arr[src].size() and i++ IF !check[arr[src][i]] Call graph(arr, arr[src][i], n, check) End End Step 4- > In main() Declare int n = 5, m = 5 Use STL vector<int> arr[n + 1] Call edges(1,4, arr) Call edges(3,4, arr).... Call lexo(arr, n) Stop
示例
#include <bits/stdc++.h> using namespace std; //用于插入边缘 void edge(int u, int v, vector<int>* arr){ arr[u].push_back(v); arr[v].push_back(u); } //DFS图形遍历的功能 void graph(vector<int>* arr, int src, int n,bool* check){ cout << src << " "; check[src] = true; for (int i = 0; i < arr[src].size(); i++){ if (!check[arr[src][i]]) graph(arr, arr[src][i], n, check); } } void lexo(vector<int>* arr, int n){ bool check[n + 1] = { 0 }; for (int i = 0; i < n; i++) sort(arr[i].begin(), arr[i].end()); for (int i = 1; i < n; i++){ if (!check[i]) graph(arr, i, n, check); } } int main(){ int n = 5, m = 5; vector<int> arr[n + 1]; // 用于插入边缘 edge(1, 4, arr); edge(3, 4, arr); edge(5, 4, arr); edge(3, 2, arr); edge(1, 5, arr); edge(1, 2, arr); edge(3, 5, arr); edge(1, 3, arr); //调用lexo函数 lexo(arr, n); return 0; }
输出结果
如果我们运行上面的程序,那么它将生成以下输出
1 2 3 4 5