题目描述:
有n个地点(n <=
10),告诉你他们之间的距离。问你从1出发经历所有的地点后再回到1.最短的距离是多少。
解题报告:
folyd枚举任意两点的最短路。
全排列n个数字。
每次排列当做一个合法的回路。
所有解得最小值就是答案。
代码如下:
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
int n, g[11][11];
int main()
{
while(scanf("%d", &n)
&& n)
{
for(int i = 0; i <= n; i++)
for(int j = 0; j <= n; j++)scanf("%d",
&g[i][j]);
for(int k = 0; k <= n; k++)
for(int i = 0; i <= n; i++)
for(int j = 0; j <= n; j++)
g[i][j] = min(g[i][j], g[i][k] + g[k][j]);
vector<int> jeo;for(int i = 1; i
<= n; i++) jeo.push_back(i);
int ans = -1;
do
{
int tmp = g[0][jeo[0]];
for(int i = 1; i < n; i++) tmp += g[jeo[i -
1]][jeo[i]];
tmp += g[jeo[n - 1]][0];
if (ans == -1 || tmp < ans) ans = tmp;
}while(next_permutation(jeo.begin(), jeo.end()));
printf("%d\n", ans);
}
return
0;
}
加载中,请稍候......