c++ 售货员的难题

售货员的难题

题目描述

某乡有n个村庄( 1 < n < 40 ),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(0 < s < 1000 )是已知的,且A村到B村与B村到A村的路大多不同。为了提高效率,他从商店出发到每个村庄一次,然后返回商店所在的村,假设商店所在的村庄为1,他不知道选择什么样的路线才能使所走的路程最短。请你帮他选择一条最短的路。

输入

村庄数n和各村之间的路程(均是整数)。

输出

最短的路程。

样例输入

3
0 2 1
1 0 2
2 1 0

样例输出

3

提示

数据解释:

3 {村庄数}

0 2 1 {村庄1到各村的路程}

1 0 2 {村庄2到各村的路程}

2 1 0 {村庄3到各村的路程}

AC代码

#include<bits/stdc++.h>
using namespace std;
int a[100][100],n,used[100],ans=9999999,sum;
void dfs(int u,int step)
{
    if(step >= ans)
    {
        return ;
    }
    if(u == 1&&sum == n)
    {
        ans = min(ans,step);
        return ;
    }
    for(int i = 1;i <= n;i ++)
        if(used[i] == 0)
        {
            used[i] = 1;
            sum ++;
            dfs(i,step + a[u][i]);
            used[i] = 0;
            sum --;
        }
}
int main()
{
    cin >> n;
    for(int i = 1;i <= n;i ++)
        for(int j = 1;j <= n;j ++)
            scanf("%d",&a[i][j]);
    dfs(1,0);
    printf("%d",ans);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/LJA001162/p/11345481.html