比赛 至少完成十道练习 评测结果 AAAAAAAAAA
题目名称 最优贸易 最终得分 100
用户昵称 Mealy 运行时间 0.268 s
代码语言 C++ 内存使用 3.75 MiB
提交时间 2017-05-22 19:13:43
显示代码纯文本
//406
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>

const int nmax=100010;
const int INF=110;

using namespace std;

vector<int > G[nmax];
vector<int > opG[nmax];
int N,M;
int val[nmax]={0};
int Min[nmax]={0};
int Max[nmax]={0};
int x,y,z;
int ans;

void PreDo(){
	ans=0;
	scanf("%d%d",&N,&M);
	for(int i=1;i<=N;i++){
		scanf("%d",&val[i]);
		Min[i]=INF;
		Max[i]=0;
	}
	for(int i=1;i<=M;i++){
		scanf("%d%d%d",&x,&y,&z);
		G[x].push_back(y);
		opG[y].push_back(x);
		if(z==2){
			G[y].push_back(x);
			opG[x].push_back(y);
		}
	}
}

void SPFA(){
	queue<int > Q;
	bool inqueue[nmax];
	memset(inqueue,0,sizeof(inqueue));
	
	Q.push(1);
	inqueue[1]=1;
	Min[1]=val[1];
	
	while(!Q.empty()){
		int tmpx=Q.front();
		Q.pop();
		inqueue[tmpx]=0;
		for(int i=0;i<G[tmpx].size();i++){
			int v=G[tmpx][i];
			if(Min[v]>Min[tmpx]||Min[v]>val[v]){
				Min[v]=min(Min[tmpx],val[v]);
				if(!inqueue[v]){
					Q.push(v);
					inqueue[v]=1;
				}
			}
		}
	}
}

void opSPFA(){
	queue<int > Q;
	bool inqueue[nmax];
	ans=max(ans,Max[N]-Min[N]);
	memset(inqueue,0,sizeof(inqueue));
	
	Q.push(N);
	inqueue[N]=1;
	Max[N]=val[N];
	
	while(!Q.empty()){
		int tmpx=Q.front();
		Q.pop();
		inqueue[tmpx]=0;
		for(int i=0;i<opG[tmpx].size();i++){
			int v=opG[tmpx][i];
			if(Max[v]<Max[tmpx]||val[v]>Max[v]){
				Max[v]=max(Max[tmpx],val[v]);
				ans=max(Max[v]-Min[v],ans);
				if(!inqueue[v]){
					Q.push(v);
					inqueue[v]=1;
				}
			}
		}
	}
	printf("%d\n",ans);
	/*
	for(int i=1;i<=N;i++){
		printf("%d %d\n",Min[i],Max[i]);
	}
	*/
}


int main(){
	freopen("trade.in","r",stdin);
	freopen("trade.out","w",stdout);
	PreDo();
	SPFA();
	opSPFA();
	return 0;
}