在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

以上是 在C程序中从1开始打印该图的按字典顺序最小的DFS。 的全部内容, 来源链接: utcz.com/z/316729.html

回到顶部