某售货员要到若干城市去推销商品,已知各城市之间的路程(或旅费)。他要选定一条从驻地出发,经过每个城市一遍,最后回到驻地的路线,使总的路程(或总旅费)最小。
输入格式:
第一行为城市数n
下面n行n列给出一个完全有向图,如 i 行 j 列表示第 i 个城市到第 j 个城市的距离。
输出格式:
一个数字,表示最短路程长度。
输入样例:
3
0 2 1
1 0 2
2 1 0
输出样例:
3
详细代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int n;
int c;
int cnt;
int x[105];
int flag[100];
int ins[100][100];
int path[10000][100];
void func(int level)
{
if (level == n)
{
for (int i = 0; i < n; i++)
path[cnt][i] = x[i];
cnt++;
}
else
{
for (int i = 1; i <= n; i++)
{
if (flag[i] == 1)
continue;
flag[i] = 1;
x[level] = i;
func(level + 1);
flag[i] = 0;
}
}
}
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
scanf("%d", &ins[i][j]);
func(0);
int min = 9999;
for (int i = 0; i < cnt; i++)
{
int start = path[i][0];
int instance = 0;
for (int j = 0; j < n - 1; j++)
instance += ins[path[i][j]][path[i][j + 1]];
instance += ins[path[i][n - 1]][start];
if (min > instance)
min = instance;
}
printf("%d\n", min);
return 0;
}