版权声明:希望能帮到弱校的ACMer成长,因为自己是弱校菜鸡~~~~ https://blog.csdn.net/Mr__Charles/article/details/82113438
HDU T1572 下沙小面的(2)
题解:
数据范围较小,用全排列和Dfs暴搜都可以—.—
Dfs暴搜
#include<cstdio>
#include<iostream>
#include<algorithm>
#define INF 0x3f3f3f3f
#define maxn 35
using namespace std;
int n,k,ans,dcnt;
int maps[maxn][maxn];
bool vis[maxn];
void Dfs(int cnt,int d,int sum){ //分别代表 目前已走过的目的地个数 目前开始位置 目前路径总和
if(cnt == dcnt){
ans = min(ans,sum);
return ;
}
for(int i = 0; i < n; i++){
if(vis[i]){
vis[i] = false;
Dfs(cnt+1,i,sum+maps[d][i]);
vis[i] = true;
}
}
}
int main(){
int d;
while(scanf("%d",&n),n){
dcnt = 0;ans = INF;
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++)
scanf("%d",&maps[i][j]);
vis[i] = false;
}
scanf("%d",&k);
for(int i = 0; i < k;i++){
scanf("%d",&d);
if(!vis[d]){ //去除重复的目的地
dcnt++;
vis[d] = true;
}
}
Dfs(0,0,0);
printf("%d\n",ans);
}
return 0;
}