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
思路
一开始没看题打了个spfa论咬文嚼字的艺术
dfs枚举先去哪一家送温暖,就这样,嗯,就这样没了,嗯,嗯
code:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
int a[49][49];
bool b[49];
int n,mx=0x7f7f7f7f;
void dfs(int x,int s,int dep)
{
if (mx<=s) return;
if (dep==n&&x==1)
{
mx=min(mx,s);
return;
}
int u=0;
if (dep+1==n)
{
dfs(1,s+a[x][1],dep+1);
return;
}
for (int i=n;i>=2;i--)
{
if (b[i]==1) continue;
if (i==x) continue;
b[i]=1;
dfs(i,s+a[x][i],dep+1);
b[i]=0;
}
return;
}
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,0);
cout<<mx;
return 0;
}