| 比赛 | 
    20101110 | 
    评测结果 | 
    AAAAAAAAAAAAAAAAAAAA | 
    | 题目名称 | 
    移动服务 | 
    最终得分 | 
    100 | 
    | 用户昵称 | 
    苏轼 | 
    运行时间 | 
    0.000 s  | 
    | 代码语言 | 
    C++ | 
    内存使用 | 
    0.00 MiB  | 
    | 提交时间 | 
    2010-11-10 20:32:45 | 
显示代码纯文本
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXL=205,MAXN=1005,oo=100000000;
int d[2][MAXL][MAXL],c[MAXL][MAXL],v[MAXN];
int n,l,re=oo;
int main()
{
	freopen("service.in","r",stdin);
	freopen("service.out","w",stdout);
	scanf("%d%d",&l,&n);
	for(int i=1;i<=l;i++)
		for(int j=1;j<=l;j++)
			scanf("%d",c[i]+j);
	for(int i=1;i<=n;i++)
		scanf("%d",v+i);
	memset(d,-1,sizeof(d));
	d[0][1][2]=0;
	v[0]=3;
	for(int i=0;i<=n;i++)
	{
		int (*f)[205]=d[(i&1)],(*g)[205]=d[((i+1)&1)];
		for(int a=1;a<=l;a++)
			for(int b=1;b<=l;b++)
				g[a][b]=-1;
		for(int a=1;a<=l;a++)
			if (a!=v[i])
			for(int b=a+1;b<=l;b++)
			if (b!=v[i]&&f[a][b]>=0)
			{
	//			printf("%d %d %d %d\n",i,a,b,f[a][b]);
				int x=min(a,min(b,v[i])),z=max(a,max(b,v[i]));
				int y=a+b+v[i]-x-z;
				#define update(p,q,r) \
				if (p!=v[i+1]&&q!=v[i+1]&&g[p][q]==-1||g[p][q]>f[a][b]+c[r][v[i+1]])\
					g[p][q]=f[a][b]+c[r][v[i+1]]
				update(x,y,z);
				update(x,z,y);
				update(y,z,x);
				#undef update
			}
	}
	for(int i=1;i<=l;i++)
		for(int j=i+1;j<=l;j++)
			if (d[(n&1)][i][j]!=-1&&d[(n&1)][i][j]<re)
				re=d[(n&1)][i][j];
	printf("%d\n",re);
	return 0;
}