记录编号 |
443187 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[NOIP 2009]最优贸易 |
最终得分 |
100 |
用户昵称 |
Hyoi_iostream |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.214 s |
提交时间 |
2017-08-29 20:10:37 |
内存使用 |
14.14 MiB |
显示代码纯文本
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#include <cmath>
using namespace std;
const int MAXN = 500000;
int n,m,e = 1,ans,head[MAXN][2],MAX[MAXN],MIN[MAXN],Data[MAXN];
bool inq[MAXN];
queue<int>q;
struct node{
int v,next;
}edge[MAXN];
inline void addedge(int u,int v){
edge[e].next = head[u][0];edge[e].v = v;head[u][0] = e++;
edge[e].next = head[v][1];edge[e].v = u;head[v][1] = e++;
}
inline void init(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&Data[i]),MIN[i]=105;
int u,v,k;
for(int i=1;i<=m;i++){
scanf("%d%d%d",&u,&v,&k);
addedge(u,v);
if(k==2) addedge(v,u);
}
}
inline void spfa_1(){
q.push(1);inq[1]=true;
MIN[1]=Data[1];
while(!q.empty()){
int x=q.front();q.pop();
inq[x]=false;
for(int i=head[x][0];i;i=edge[i].next){
int v=edge[i].v;
if(MIN[v]>MIN[x]||MIN[v]>Data[v]){
MIN[v]=min(MIN[x],Data[v]);
if(!inq[v]) q.push(v),inq[v]=true;
}
}
}
}
inline void spfa_2(){
q.push(n);inq[n]=true;
MAX[n]=Data[n];ans=max(ans,MAX[n]-MIN[n]);
while(!q.empty()){
int x=q.front();q.pop();
inq[x]=false;
for(int i=head[x][1];i;i=edge[i].next){
int v=edge[i].v;
if(MAX[v]<MAX[x]||MAX[v]<Data[v]){
MAX[v]=max(MAX[x],Data[v]);
ans=max(MAX[v]-MIN[v],ans);
if(!inq[v]) q.push(v),inq[v]=true;
}
}
}
}
int main(){
freopen("trade.in","r",stdin);
freopen("trade.out","w",stdout);
init();
spfa_1();
memset(inq,0,sizeof(inq));
spfa_2();
printf("%d\n",ans);
fclose(stdin);
fclose(stdout);
return 0;
}