比赛 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;
}