#include<stdio.h> #include<algorithm> #include<string.h> using namespace std; int n,m,b[100],c[100],a[100],minlength; int map[100][100]; void dfs(int step,int length,int last) { if(step==m) { minlength=min(length,minlength); return; } else { for(int i=0; i<m; i++) if(!b[i]) { b[i]=1; dfs(step+1,length+map[last][a[i]],a[i]); b[i]=0; } } } int main() { while(~scanf("%d",&n),n) { int i,j; memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); for(i=0; i<n; i++) for(j=0; j<n; j++) scanf("%d",&map[i][j]); scanf("%d",&m); for(i=0; i<m; i++) scanf("%d",&c[i]); sort(c,c+m);//先排序在去重 for(j=i=0; i<m-1; i++) if(c[i]!=c[i+1]) a[j++]=c[i]; a[j]=c[i]; m=j+1; minlength=0x3f3f3f3f;//最大值 dfs(0,0,0); printf("%d ",minlength); } return 0; } //#include<iostream> //#include<queue> //#include<stdio.h> //#include<algorithm> //using namespace std; //int map[31][31],n; //int main() //{ // int i,j,m,sum,a[10],b[10],x; // while(~scanf("%d",&n),n) // { // sum=999999; // for(i=0; i<n; i++) // for(j=0; j<n; j++) // scanf("%d",&map[i][j]); // scanf("%d",&m); // for(i=0; i<m; i++) // scanf("%d",&b[i]); // sort(b,b+m); // b[m]=-1; // for(j=i=0; i<m; i++) // if(b[i]!=b[i+1]) // a[j++]=b[i]; // m=j; // do // { // x=map[0][a[0]];//计算的是0站和a[0]站的距离 // for(i=1; i<m; i++) // x+=map[a[i-1]][a[i]];//以为地图的数据代表的是两站之间的距离,所以可以累加 // if(x<sum) // sum=x; // } // while(next_permutation(a,a+m));//等于是遍历输入的站之间的二叉树排列,求出最短的距离 // printf("%d ",sum); // } // return 0; //}