1493货员的难题

41 篇文章 0 订阅

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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值