#include<stdio.h>
#include<string>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<map>
#include<queue>
#include<vector>
#define LL long long
#define inf 0x3f3f3f3f
#define mem(a,b) memset(a,b,sizeof(a))
#define ABS(a) a>=0?a:-a
const double eps=1e-7;
int n,k,sum,c,p;
int a[35][35];
int b[8];
int num[35];//注意数组的大小,最多有30个站点;
void dfs(int x,int ans)
{
if(p==c)
{
if(sum>ans)
{
sum=ans;
}
}
for(int i=0;i<n;i++)
{
if(num[i])
{
num[i]=0;
p++;
dfs(i,ans+a[x][i]);
p--;
num[i]=1;
}
}
}
int main()
{
while(~scanf("%d",&n))
{
sum=999999999;
p=0;
c=0;//乘客总共要去几个站,初始化
if(n==0)
break;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
}
scanf("%d",&k);
memset(num,0,sizeof(num));//初始化
for(int i=1;i<=k;i++)
{
scanf("%d",&b[i]);
num[b[i]]=1;//去的站标记为一
}
for(int i=0;i<n;i++)
if(num[i])
c++;//计数
dfs(0,0);
printf("%d\n",sum);
}
#include<string>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<map>
#include<queue>
#include<vector>
#define LL long long
#define inf 0x3f3f3f3f
#define mem(a,b) memset(a,b,sizeof(a))
#define ABS(a) a>=0?a:-a
const double eps=1e-7;
int n,k,sum,c,p;
int a[35][35];
int b[8];
int num[35];//注意数组的大小,最多有30个站点;
void dfs(int x,int ans)
{
if(p==c)
{
if(sum>ans)
{
sum=ans;
}
}
for(int i=0;i<n;i++)
{
if(num[i])
{
num[i]=0;
p++;
dfs(i,ans+a[x][i]);
p--;
num[i]=1;
}
}
}
int main()
{
while(~scanf("%d",&n))
{
sum=999999999;
p=0;
c=0;//乘客总共要去几个站,初始化
if(n==0)
break;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
}
scanf("%d",&k);
memset(num,0,sizeof(num));//初始化
for(int i=1;i<=k;i++)
{
scanf("%d",&b[i]);
num[b[i]]=1;//去的站标记为一
}
for(int i=0;i<n;i++)
if(num[i])
c++;//计数
dfs(0,0);
printf("%d\n",sum);
}
}
2018.3.20 总出现小毛病,细心啊…………