记录编号 220705 评测结果 AAAAA
题目名称 [HAOI 2005]希望小学 最终得分 100
用户昵称 Gravatarliu_runda 是否通过 通过
代码语言 C++ 运行时间 0.001 s
提交时间 2016-01-20 10:22:59 内存使用 0.30 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#define max(a,b) a>b?a:b
int x[33],y[33];
int disb[33][33],disg[33][33];
bool inq[33];
int q[30];
int head,tail;
void add(int a){
	if(!inq[a]){
		q[tail++]=a;
		inq[a]=true;
		if(tail==30)tail=0;
	}
}
void _add(int a){
	if(!inq[a]){
		if(head!=0)q[--head]=a;
		else {
			head = 29;
			q[29] = a;
		}
		inq[a] = true;
	}
}
void del(){
	inq[q[head]]=false;
	head=(head+1)%30;
}
int n;
void spfa(int d[][33],int s){
	memset(inq,0,sizeof(inq));
	memset(q,0,sizeof(q));
	for(int i = 1;i<=n;++i)if(s!=i&&d[s][i]!=1<<20)add(i);
	while(head!=tail){
		int v = q[head];
		for(int i = 1;i<=n;++i){
			if(d[s][v]+d[v][i]<d[s][i]){
				d[s][i]=d[s][v]+d[v][i];
				if(d[s][i]>d[s][q[head]])add(i);
				else _add(i);
			}
		}
		del();
	}
}
int main(){
	freopen("hopeschool.in","r",stdin);
	freopen("hopeschool.out","w",stdout);
	int b1,b2,b3,g1,g2,g3;
	scanf("%d %d %d %d %d %d %d",&n,&b1,&b2,&b3,&g1,&g2,&g3);
	for(int i = 1;i<=n;++i)scanf("%d",x+i);
	for(int i = 1;i<=n;++i)scanf("%d",y+i);
	int k;
	scanf("%d",&k);
	int a,b,s1,s2,s3;
	for(int i = 1;i<=n;++i){
		for(int j = 1;j<=n;++j)
			disb[i][j] = disg[i][j] = 1<<20;
	}
	for(int i = 0;i<k;++i){
		scanf("%d %d %d %d %d",&a,&b,&s1,&s2,&s3);
		disb[a][b]=s1*b1+s2*b2+s3*b3;
		disb[b][a]=s1*b1+s2*b3+s3*b2;
		disg[a][b]=s1*g1+s2*g2+s3*g3;
		disg[b][a]=s1*g1+g2*s3+g3*s2;
	}
	for(int i = 1;i<=n;++i){
		spfa(disb,i);
		spfa(disg,i);
	}
	int mintot = 1<<25,ans = -1;
	for(int i = 1;i<=n;++i){
		int nowtot = 0;
		for(int j = 1;j<=n;++j){
			if(i!=j){
			nowtot+=x[j]*disb[j][i];
			nowtot+=y[j]*disg[j][i];
			}
		}
		if(nowtot<mintot){
			mintot=nowtot;
			ans = i;
		}
	}
	printf("%d\n",ans);
	fclose(stdin);fclose(stdout);
	return 0;
}