第21题(DFS):售货员的难题

 
 

题目描述

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

1 0 2 2 1 0 【样例输出】 3 【数据解释】  3 {村庄数}  0 2 l {村庄1到各村的路程}  1 0 2 {村庄2到各村的路程}  2 1 0 {村庄3到各村的路程} 

AC CODE:

#include <bits/stdc++.h>
using namespace std;
#define max 0xFFFFFF
int n;
int x[25];
int bestx[25];
int bestc;
int cc;
int a[25][25];
void swap(int &a,int &b) {
    int tep = a;
    a=b;
    b=tep;
}
void dfs(int i) {
    int j;
    if(i==n) {
        if(a[x[n-1]][x[n]]<max&&a[x[n]][1]<max&&(bestc==max||cc+a[x[n-1]][x[n]]+a[x[n]][1]<bestc)) {
            for(j=1; j<=n; j++)
                bestx[j]=x[j];
            bestc=cc+a[x[n-1]][x[n]]+a[x[n]][1];
        }
    } else {
        for(j=i; j<=n; j++)
            if(a[x[i-1]][x[j]]<max&&(bestc==max||cc+a[x[i-1]][x[j]]<bestc)) {
                swap(x[i],x[j]);
                cc+=a[x[i-1]][x[i]];
                dfs(i+1);
                cc-=a[x[i-1]][x[i]];
                swap(x[i],x[j]);
            }
    }
}
int tsp() {
    int i;
    for(i=1; i<=n; i++)
    x[i]=i;
    bestc = max;
    cc=0;
    dfs(2);
    return bestc;
}
int main() {
    cin>>n;
    for(int i=1; i<=n; i++)
        for(int j=1; j<=n; j++)
            cin>>a[i][j];
    cout<<tsp()<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/HYWRay/article/details/79944207