记录编号 443187 评测结果 AAAAAAAAAA
题目名称 [NOIP 2009]最优贸易 最终得分 100
用户昵称 GravatarHyoi_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;
}