蛮力法解决城市最短路径问题

题目

某旅行者希望外出旅游,他罗列了需要旅游的所有城市以及城市之间的旅行距离。现他希望能够将所有这些城市旅行一遍然后回到初始出发的城市,同时希望旅游中所行驶的总的距离最短。请编写程序规划一种旅游方式以满足他的要求。
输入要求:输入第1行为整数n和m,其中n表示待旅行的城市数量, m表示旅行者出发的城市编号,1≤m≤n。后面的n行,每行有n个整数,分别表示城市之间的距离。
输出要求:输出的第1行为一个整数,表示该旅行者所行驶的最少距离,第2行有n+1个整数,整数之间用空格隔开,表示旅行者旅游的城市编号,包括起始城市编号以及旅行结束后回到的城市编号。

源代码

#include
#include
#include
#include
using namespace std;

// made by LinHeng
vector path;//用于存储所有可能的路径
vectorPathLength;//用于存储路径对应的大小

void FullRank(string city, int i)

{
	if (i == city.length() - 1)//完成排列
	{
		path.push_back(city);//把排列加入数组
		return;
	}
	for (int j = i; j < city.length(); j++)
	{
		/*city.at(i) = city.at(j);*/
		swap(city.at(i), city.at(j));//第一次分别把所有字符交换到最前面,第二次分别把所有字符交换到第二位
		FullRank(city, i + 1);
	}
}//生成全排列

void CalculateLength(vector>distance, int m)
{
	for (int i = 0; i < path.size(); i++)//计算每个路径长度
	{
		for (int j = 0; j < path.at(i).length(); j++)
		{
			if (j == 0) {

				PathLength.push_back(0);
				PathLength.at(i) += distance.at(m).at((int)(path.at(i).at(j)) - '0');

			}
			if (j == path.at(i).length() - 1)
			{
				PathLength.at(i) += distance.at((int)(path.at(i).at(j) - '0')).at(m);
				continue;
			}
			PathLength.at(i) += distance.at((int)(path.at(i).at(j)) - '0').at((int)(path.at(i).at(j + 1) - '0'));
		}
	}
}
int main()
{
	int n, m;//城市数和出发城市
	cin >> n >> m;
	vector> distance(n, vector(n));//存储城市间距离
	for (int i = 0; i < distance.size(); i++)
		for (int j = 0; j < distance.at(i).size(); j++)
			cin >> distance.at(i).at(j);//输入距离,无穷大用99999代替
	//----以上是输入

	string city;
	for (int i = 0; i < n; i++)
	{
		if (i != m)
		{
			city.push_back(i + '0');
		}
	}//列出需要排列的城市
	FullRank(city, 0);//全排列除出发城市之外的城市
	CalculateLength(distance, m);//计算每个排列对应的路径长度
	vectorPathLengthCopy(PathLength);//存储排序前的距离
	sort(PathLength.begin(), PathLength.end());//距离排序
	cout << PathLength[0] << endl;//输出最短距离
	cout << m << " ";
	for (int i = 0; i < path.size(); i++)
	{
		if (PathLengthCopy.at(i) == PathLength[0])
		{
			for (int j = 0; j < path.at(i).length(); j++)
			{
				cout << path.at(i).at(j) << " ";
			}
			break;
		}
	}//输出最短路径
	cout << m;
	return 0;
}

你可能感兴趣的:(算法导论)