C ++セールスマン問題

巡回セールスマン問題

タイトル説明

Mouxiang N-村(1 <N <40)、店員があり、彼は村の間にS(0 <S <1000)が知られているから、自動販売機販売する村したい、そして村にA村のほとんどは別の村の道路にBとB村。効率を向上させるために、彼は一度ストアからすべての村に着手し、その後、仮定が、彼は最短歩行距離を作るためにラインの種類を知りませんでした1つの選択肢であるお店、村の店の村に戻ります。彼は最短経路を選択するために頼みます。

エントリー

nおよび村の村の間の距離(整数)。

輸出

最短距離。

サンプル入力

3
0 2 1
1 0 2
2 1 0

サンプル出力

3

プロンプト

データの解釈:

{3}の数村

{1}歩く村021村

村102の村{2}距離

村210の村{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