1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| #include <bits/stdc++.h> #define ios ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); using namespace std; const int MAXN=500000; const int INF=0x3f3f3f3f; struct node{ int to,next; }e[MAXN]; queue<int> q; int head[MAXN],val[MAXN],mi[MAXN],mx[MAXN],rhead[MAXN]; int n,m,tot,s,flag=0; void add(int u,int v,int head[]){ e[tot]={v,head[u]}; head[u]=tot++; } void spfa(int s){ q.push(s); while(!q.empty()){ int fr=q.front(); q.pop(); int i=flag==0?head[fr]:rhead[fr]; for( ;~i;i=e[i].next){ int v=e[i].to; if(!flag && min(mi[fr],val[v])<mi[v]){ mi[v]=min(mi[fr],val[v]); q.push(v); } else if(flag && max(mx[fr],val[v])>mx[v]){ mx[v]=max(mx[fr],val[v]); q.push(v); } } } } int main() { ios; memset(head,-1,sizeof head); memset(rhead,-1,sizeof rhead); memset(mi,0x3f,sizeof mi); cin>>n>>m; for(int i=1;i<=n;i++) cin>>val[i]; while(m--){ int u,v,o; cin>>u>>v>>o; add(u,v,head); add(v,u,rhead); if(o==2){ add(v,u,head); add(u,v,rhead); } } mi[1]=val[1]; mx[n]=val[n]; spfa(1); flag=1; spfa(n); int ans=-1; for(int i=1;i<=n;i++) ans=max(ans,mx[i]-mi[i]); cout<<ans<<'\n'; return 0; }
|