记录编号 135994 评测结果 AAAAAAAAAA
题目名称 [東方S2] 伊吹萃香 最终得分 100
用户昵称 Gravatar水中音 是否通过 通过
代码语言 C++ 运行时间 0.060 s
提交时间 2014-11-02 08:16:09 内存使用 0.83 MiB
显示代码纯文本
/*
AiKy
suika!!!!!呜哇!!!!!
*/
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
int qwq=0x7fffffff;
bool flag[2][5001]={0},flag2[5001]={0};
int m[5001]={0},xt[5001]={0},head[5001]={0},to[40000]={0},ne[40000]={0},w[40000]={0},rew[40000]={0},zui[2][5001]={0};
int i,j=0,p,zj1,zj2,zj3,n,s,ans;
int ABS(int x){if(x<0)return -x;return x;}
int MIN(int x,int y){if(x<y)return x;return y;}
queue<int> A,B;
void init()
{
	scanf("%d%d",&n,&s);
	for(i=1;i<=n;i++)scanf("%d",&flag2[i]);
	for(i=1;i<=n;i++)scanf("%d",&m[i]);
	for(i=1;i<=n;i++)scanf("%d",&xt[i]);
	for(i=1;i<=s;i++)
	{
		scanf("%d%d%d",&zj1,&zj2,&zj3);
		to[i]=zj2;
		ne[i]=head[zj1];
		head[zj1]=i;
		w[i]=zj3;
		rew[i]=zj3;
		if(flag2[zj1]&&!flag2[zj2])
		{
			w[i]+=ABS(m[zj1]-m[zj2]);
			rew[i]-=ABS(m[zj1]-m[zj2]);
		}
		else if(flag2[zj2]&&!flag2[zj1])
		{
			w[i]-=ABS(m[zj1]-m[zj2]);
			rew[i]+=ABS(m[zj1]-m[zj2]);
		}
		if(w[i]<0)w[i]=0;
  		if(rew[i]<0)rew[i]=0;
	}
	j=s;
	for(i=1;i<=n;i++)
	{
		to[++j]=i;
		ne[j]=head[i];
		head[i]=j;
		if(flag2[i])w[j]=xt[i],rew[j]=0;
		else rew[j]=xt[i],w[j]=0;
	}
}
void SPFA()
{
	for(i=1;i<=n;i++)zui[0][i]=qwq,zui[1][i]=qwq;
	zui[0][1]=0;
	A.push(1);
	B.push(0);
	flag[0][1]=true;
	while(!A.empty())
	{
		zj1=A.front();A.pop();
		zj2=B.front();B.pop();
		flag[zj2][zj1]=false;
		if(zj2==0)
		for(i=head[zj1];i;i=ne[i])
		{
			zj3=zui[0][zj1]+w[i];
			if(zj3<0)zj3=0;
			if(zj3<zui[1][ to[i] ])
			{
				zui[1][ to[i] ]=zj3;
				if(!flag[1][ to[i] ])
				{
					A.push(to[i]);
					B.push(1);
					flag[1][ to[i] ]=true;
				}
			}
		}
		else
		for(i=head[zj1];i;i=ne[i])
		{
			zj3=zui[1][zj1]+rew[i];
			if(zj3<0)zj3=0;
			if(zj3<zui[0][ to[i] ])
			{
				zui[0][ to[i] ]=zj3;
				if(!flag[0][ to[i] ])
				{
					A.push(to[i]);
					B.push(0);
					flag[0][ to[i] ]=true;
				}
			}
		}
	}
}
int main()
{
	////v////suika
	freopen("suika.in","r",stdin);
	freopen("suika.out","w",stdout);
	init();
	SPFA();
	ans=MIN(zui[0][n],zui[1][n]);
	printf("%d\n",ans);
	return 0;
}