HDU-1572 下沙小面的(2)
题意:给出n*n的矩阵、代表两点之间的距离,给出k个乘客和乘客要下的站点,起点在0,求从起点到每个站点的最短距离。
思路:dfs找出最短距离即可.
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1572
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cmath> 5 #include <string> 6 #include <algorithm> 7 #include <iostream> 8 using namespace std; 9 const int N=31; 10 const int inf=1<<30; 11 12 int len[N][N]; 13 bool vis[8],flag[N]; 14 int n,k,b[8]; 15 int MIN,cnt; 16 17 void dfs(int s,int t,int sum){ 18 if(t==cnt){ 19 MIN=min(MIN,sum); 20 return ; 21 } 22 for(int i=1;i<=cnt;i++){ 23 if(!vis[i]){ 24 vis[i]=true; 25 dfs(b[i],t+1,sum+len[s][b[i]]); 26 vis[i]=false; 27 } 28 } 29 } 30 31 int main(){ 32 33 // freopen("data.in","r",stdin); 34 // freopen("data.out","w",stdout); 35 36 while(scanf("%d",&n),n){ 37 for(int i=0;i<n;i++) 38 for(int j=0;j<n;j++) 39 scanf("%d",&len[i][j]); 40 scanf("%d",&k); 41 int m; 42 memset(flag,false,sizeof(flag)); 43 for(int i=0;i<k;i++){ 44 scanf("%d",&m); 45 flag[m]=true; 46 } 47 cnt=0; 48 for(int i=1;i<N;i++){ 49 if(flag[i]) 50 b[++cnt]=i; 51 } 52 memset(vis,false,sizeof(vis)); 53 MIN=inf; 54 dfs(0,0,0); 55 printf("%d\n",MIN); 56 } 57 return 0; 58 }