C++ 程序解决无权图的旅行商问题

c++server side programmingprogramming

旅行商问题用于计算覆盖所有城市并返回原点城市的最短路线。此方法用于查找覆盖图的所有节点的最短路径。

这是查找无权图最短路线的程序。

算法

开始
   定义一个通用变量 vr = 4。
   声明一个整数函数 TSP 来实现旅行商问题。
   将图 grph[][] 声明为 2D 矩阵,将变量 p 声明为整数数据类型。
   将它们作为参数传递。
   将变量 ver 声明为向量数据类型。
   for (int i = 0; i < vr; i++)
      if (i != p) then
         调用 push_back(i) 函数存储除源顶点之外的所有顶点的值。
         初始化 m_p = INT_MAX 以存储图的最小权重。
      do
         将 cur_pth、k 声明为整数数据类型。
              初始化 cur_pth = 0。
            初始化 k = p。
         for (int i = 0; i < ver.size(); i++)
            cur_pth += grph[k][ver[i]].
            k = ver[i].
         cur_pth += grph[k][p].
           m_p = min(m_p, cur_pth) 更新最小权重值。
         while (next_permutation(ver.begin(), ver.end()))。
         返回 m_p。
   将图 grph[][] 声明为整型数据类型的 2D 矩阵。
      初始化 grph[][] 图的值。
   将变量 p 声明为整型数据类型。
      初始化 p = 0。
   打印"结果为:"。
   打印TSP()函数的返回值。
结束。

示例

#include <bits/stdc++.h>
using namespace std;
#define vr 4
int TSP(int grph[][vr], int p) // 实现旅行商问题。{
   vector<int> ver; //
   for (int i = 0; i < vr; i++)
      if (i != p)
         ver.push_back(i);
           int m_p = INT_MAX; // 存储图的最小权重
   do {
      int cur_pth = 0;
      int k = p;
      for (int i = 0; i < ver.size(); i++) {
         cur_pth += grph[k][ver[i]];
         k = ver[i];
      }
      cur_pth += grph[k][p];
      m_p = min(m_p, cur_pth); // 更新最小权重值
   }
   while (next_permutation(ver.begin(), ver.end()));
   return m_p;
}
int main() {
   int grph[][vr] = { { 0, 5, 10, 15 }, //矩阵形式的图的值
      { 5, 0, 20, 30 },
      { 10, 20, 0, 35 },
      { 15, 30, 35, 0 }
   };
   int p = 0;
   cout<< "\n 结果为: "<< TSP(grph, p) << endl;
   return 0;
}

输出

结果为: 75

相关文章