Description
某乡有 n 个村庄( 1 < n <40 ),有一个售货员,他要到各个村庄去售货,各村庄之间的路程 s(0<s<1000) 是已知的,且 A 村与 B 村与 B 村与 A 村的路大多不同,为了提高效率,他从商店出发到每个村庄一次,然后返回商店所在的村,假设商店所在的村庄为 1 ,他不知道选择什么样的路才能使所走的路程最短,请你帮助他选择一条路径。
Input
村庄数 n 和各村之间的路程(均是整数)
Output
最短路程
Sample Input
3 // 村庄数量
0 2 1 // 村庄 1 到各村的路程
1 0 2
2 1 0
Sample Output
3
代码过于简单,但要注意细节
#include<iostream>
using namespace std;
int m,n,k,x,y,bz[1000],head[100100],tot,maxx=10000000;
struct node{
int x,y,next,w;
}a[100010];
void add(int x,int y,int k){
tot++;
a[tot].x=x;
a[tot].y=y;
a[tot].next=head[x];
a[tot].w=k;
head[x]=tot;
}
void dfs(int now,int x,int w){
if(now>n){
if(w<maxx)maxx=w;
return;
}
for(int i=head[x];i;i=a[i].next){
if(w+a[i].w>maxx)continue;//剪枝
if(bz[a[i].y]==0){//如果可以走就走
bz[a[i].y]=1;
w+=a[i].w;
dfs(now+1,a[i].y,w);
bz[a[i].y]=0;
w-=a[i].w;
}
if(now==n&&a[i].y==1){//如果下一个是原点,并且已经走完了所有点,那就走
w+=a[i].w;
dfs(now+1,a[i].y,w);
w-=a[i].w;
}
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>k;
if(k==0)continue;
add(i,j,k);
}
}
bz[1]=1;
dfs(1,1,0);
cout<<maxx;
}