下沙小面的(2)

来源:互联网 发布:魔兽世界官网mac下载 编辑:程序博客网 时间:2024/05/17 07:28

/*  又加入一个水题,没有一点突破,简单题就是这样,转转又转回来了,本质上还是水题一个,没什么意思。但是我的代码确实写得没动脑筋,还是那个全排列的模板,想都没想直接套,然后就过了,以后写这样的水题,私下里还是要改进一下代码比较好 */

#include < iostream >#include <   map    >#include < cstdio   >#define   N        31#define inf 0x3f3f3f3fusing namespace  std;bool v[N];map< int , int > m;map<int,int>::iterator it;int a[N][N],n,b[N],w[N],b1,s;int Min(int x , int y) {return x<y?x:y;}void check(){int i,temp;for(temp=0,i=1 ; i<b1 ; i++)temp+=a[w[i-1]][w[i]];s=Min(s , temp);}void dist(int k){int i;if(k>=b1){w[0]=0;check();return ;}for(i=1 ; i<b1 ; i++){if(!v[i]){v[i]=1;w[k]=b[i];dist(k+1);v[i]=0;}}}int main (){//freopen("t.txt","r",stdin);int i,j,k,t;while(~scanf("%d",&n),n){m.clear();for(i=0 ; i<n ; i++)for(j=0 ; j<n ; j++)scanf("%d",&a[i][j]);scanf("%d",&t);for(i=0 ; i<t ; i++)scanf("%d",&k),m[k]=1;b[0] = 0;memset(v,0,sizeof(v));for(b1=1,it=m.begin();it!=m.end();it++)if(it->second==1)b[b1++]=it->first;/*for(i=1 ; i<b1 ; i++) cout<<b[i]<<' ';cout<<endl;*/s=inf;dist(1);printf("%d\n",s);}return 0;}