题目描述:
有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;
}
 
							
		 
						
		加载中,请稍候......