HDU 1572 (DFS)
#include<stdio.h> #include<string.h> #define maxn 33 int n,k,a,mini,RK; int mapp[maxn][maxn],w[maxn]; void dfs(int station,int coun,int dis){ if(coun==RK){ if(mini>dis) mini=dis; } for(int i=1;i<n;i++){ if(w[i]!=0){ w[i]=0; dfs(i,coun+1,dis+mapp[station][i]); w[i]=1; } } } int main(){ while(scanf("%d",&n)){ mini=31000; if(n==0) break; RK=0; memset(mapp,0,sizeof(mapp)); memset(w,0,sizeof(w)); for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ scanf("%d",&mapp[i][j]); } } scanf("%d",&k); for(int i=0;i<k;i++){ scanf("%d",&a); if(w[a]==0) { RK++; w[a]=1; } } dfs(0,0,0); printf("%d\n",mini); } return 0; }