比赛 至少完成十道练习 评测结果 AAAAAAAAAA
题目名称 最优贸易 最终得分 100
用户昵称 Ostmbh 运行时间 0.650 s
代码语言 C++ 内存使用 2.99 MiB
提交时间 2017-05-20 21:40:41
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
vector<int>A[100001];
const int INF=0x7fffffff/2;
int val[100001];
int maxx[100001]={0};
int minn[100001]={0};
int vis[100001]={0};
queue<int>q;
int n,m;
int main(){
	freopen("trade.in","r",stdin);
	freopen("trade.out","w",stdout);
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		cin>>val[i];
	int x,y,z;
	for(int i=1;i<=m;i++){
		cin>>x>>y>>z;
		A[x].push_back(y);
		if(z==2){
			A[y].push_back(x);
		}
	}
	q.push(1);
	maxx[1]=0;
	memset(minn,127,sizeof(minn));
	while(!q.empty()){
		int cd=q.front();
		q.pop();
		vis[cd]=0;
		for(int i=0;i<A[cd].size();i++){
			int u=A[cd][i];
			if(val[cd]<minn[u]){
				minn[u]=val[cd];
				if(!vis[u]){
					vis[u]=1;
					q.push(u);
				}
			}
			if(minn[cd]<minn[u]){
				minn[u]=minn[cd];
				if(!vis[u]){
					vis[u]=1;
					q.push(u);
				}
			}
			if(val[u]-minn[u]>maxx[u]){
				maxx[u]=val[u]-minn[u];
				if(!vis[u]){
					vis[u]=1;
					q.push(u);
				}
			}
			if(maxx[cd]>maxx[u]){
				maxx[u]=maxx[cd];
				if(!vis[u]){
					vis[u]=1;
					q.push(u);
				}
			}
		}
	}
	cout<<maxx[n]<<endl;
return 0;
}