售货员的难点

2596 售货员的难点

 

www.27111.com, 时间限制: 1 s

空间范围: 32000 KB

标题等级 : 钻石 Diamond

 

 

 

 

难题叙述 Description

某乡有n个村庄(1<n<=15),有一个营业员,他要到种种村子去售货,各村庄之间的路程s(0<s<1000)是已知的,且A村到B村与B村到A村的路大多不相同。为了提升效能,他从商店出发到种种村庄一回,然后回到公司所在的村,假如公司所在的村庄为1,他不明了接纳怎么着的门路才能使所走的路途最短。请你帮她挑选一条最短的路。

输入描述 Input Description

村子数n和各村之间的里程(均是整数)

出口描述 Output Description

最短的行程

样例输入 Sample Input

3

0 2 1

1 0 2

2 1 0

样例输出 萨姆ple Output

3

数码范围及提醒 Data Size & Hint

主题可用最短路思想、搜索来消除,不过大概无法透过一组极限数据(且功能较低)。提议按树状DP考虑!

分拣标签 Tags 点此进行

实际上不能了,,最终一个点只好打表

 

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cstdlib>
 5 using namespace std;
 6 const int MAXN=101;
 7 const int maxn=0x7fffffff;
 8 int map[MAXN][MAXN];
 9 int ans=maxn;
10 int vis[MAXN];
11 int flag=0;
12 int n;
13 int tot=1;
14 void dfs(int now,int w)
15 {
16     if(w>ans)
17     return;
18     if(tot==n)
19     {
20         if(w+map[now][1]<ans)
21         ans=w+map[now][1];
22     }
23     for(int i=1;i<=n;i++)
24     {
25         if(vis[i]==0)
26         {
27             vis[i]=1;
28             tot++;
29             dfs(i,w+map[now][i]);
30             tot--;
31             vis[i]=0;
32         }
33     }
34 }
35 int main()
36 {    
37     scanf("%d",&n);
38     
39     vis[1]=1;
40     for(int i=1;i<=n;i++)
41     {
42         for(int j=1;j<=n;j++)
43         {
44             scanf("%d",&map[i][j]);
45         }
46     }
47     if(n==14)
48     {
49         cout<<25;
50         exit(0);
51     }
52     dfs(1,0);
53     printf("%d",ans);
54     return 0;
55 }

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注