记录编号 59428 评测结果 AAAAA
题目名称 [NOI 1998]SERNET模拟 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 C++ 运行时间 0.014 s
提交时间 2013-05-06 21:21:28 内存使用 0.51 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<map>
#include<set>
#include<deque>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdlib>
using namespace std;
const int SIZEN=101,INF=0x7fffffff/2;
const int SIZEP=10001;
//下标是1~n
int n,m,k,test;
int c[SIZEN][SIZEN]={0};
int leng[SIZEN][SIZEN]={0};
int maxl[SIZEN]={0};//每个点连出的最长边
int lis[SIZEN]={0};
class PACK{
public:
	int t;
	int source,goal;
	PACK(){t=source=goal=0;}
}p[SIZEP];
int S,T;
void floyd(void){
	int i,j,k;
	for(k=1;k<=n;k++){
		if(k==S||k==T) continue;
		for(i=1;i<=n;i++){
			if(i==T) continue;
			for(j=1;j<=n;j++){
				if(j==S) continue;
				leng[i][j]=min(leng[i][j],leng[i][k]+leng[k][j]);
			}
		}
	}
}
void read(void){
	int i,j;
	int a,b,t;
	scanf("%d",&n);
	for(i=1;i<=n;i++){
		for(j=1;j<i;j++) c[i][j]=c[j][i]=INF;
	}
	for(i=1;i<=n;i++){
		scanf("%d",&a);
		lis[a]=i;
	}
	scanf("%d",&m);
	for(i=1;i<=m;i++){
		scanf("%d%d%d",&a,&b,&t);
		c[lis[a]][lis[b]]=c[lis[b]][lis[a]]=t;
	}
	scanf("%d",&k);
	for(i=1;i<=k;i++){
		scanf("%d%d%d%d",&a,&p[i].t,&p[i].source,&p[i].goal);
		p[i].source=lis[p[i].source],p[i].goal=lis[p[i].goal];
	}
	scanf("%d",&test);//测试的时刻
}
void getmaxl(void){
	int i,j,nowmax;
	for(i=1;i<=n;i++){
		nowmax=-1;
		for(j=1;j<=n;j++){
			if(c[i][j]!=INF) nowmax=max(nowmax,c[i][j]);
		}
		maxl[i]=nowmax;
	}
}
#define now p[x]
int final(int x){//数据包x最终延续到的时间
	int ans=-1;
	int i,n1,n2;
	for(i=1;i<=n;i++){
		n1=leng[now.source][i];
		n2=(i==now.goal)?0:maxl[i];
		if(n1!=INF) ans=max(ans,n1+n2);
	}
	return now.t+ans;
}
bool check(int x){//数据包x是否在时刻test存在于网络中
	return final(x)>test;
}
void slove(void){
	int ans=0;
	int i,j,x;
	for(x=1;x<=k;x++){
		for(i=1;i<=n;i++){
			for(j=1;j<=n;j++){
				leng[i][j]=c[i][j];
			}
		}
		S=p[x].source,T=p[x].goal;
		floyd();
		if(check(x)) ans++;
	}
	printf("%d\n",ans);
}
int main(){
	freopen("sernet.in","r",stdin);
	freopen("sernet.out","w",stdout);
	read();
	getmaxl();
	slove();
	return 0;
}