货员的难题
PS:本题解只是为了学习简单图论而做的,学校OJ数据较水,本代码在洛谷开O2只能过九个点。
题目链接:货员的难题(SSL)
题目链接:货员的难题(洛谷)
题目描述
某乡有nnn个村庄(1<n≤201),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(0<s<1000)是已知的,且A村到B村与B村到A村的路大多不同。为了提高效率,他从商店出发到每个村庄一次,然后返回商店所在的村,假设商店所在的村庄为1,他不知道选择什么样的路线才能使所走的路程最短。请你帮他选择一条最短的路。
输入格式
村庄数nnn和各村之间的路程(均是整数)。
输出格式
最短的路程。
输入输出样例
输入
3
0 2 1
1 0 2
2 1 0
输出
3
解题思路
这道题本作者用的是DFS,反正搜啊搜就是了。
参考程序
#include<iostream>
using namespace std;
int n,a[50][50],b[50],hd[41];
int minn=0x3f3f3f3f,tot=0;
struct abc{
int x,y,next,s;
}f[1010];
void add(int i,int j,int a)
{
tot++;
f[tot].x=i;
f[tot].y=j;
f[tot].next=hd[i];
f[tot].s=a;
hd[i]=tot;
}
void dfs(int now,int ans,int sh)
{
if(now==1&&sh>n)
{
if(ans<minn)
minn=ans;
return;
}
if(b[1]==1)
return;
if(ans+n-sh+1>=minn)
return;
for(int i=hd[now];i;i=f[i].next)
{
if(!b[f[i].y])
{
b[f[i].y]=1;
dfs(f[i].y,ans+f[i].s,sh+1);
b[f[i].y]=0;
}
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
int a;
cin>>a;
if(a)
add(i,j,a);
}
dfs(1,0,1);
cout<<minn<<endl;
}