#include "bits/stdc++.h"
using namespace std;
using PII = pair<int , int>;
using VI = vector<int>;
int n,m;
int val[100010];
int vis[100010];
int disMax[100010];
int disMin[100010];
VI g[100010];
VI h[100010];
void spfa(){
memset(vis,0,sizeof vis);
//memcpy(disMin,val,sizeof val);
memset(disMin,0x3f,sizeof disMin);
queue<int> q;
q.push(1);
vis[1] = 1;
disMin[1] = val[1];
while(!q.empty()){
int x = q.front();
q.pop();
vis[x] = false;
for(int i=0;i<g[x].size();i++){
int to = g[x][i];
if(disMin[to] > disMin[x]){
disMin[to] = min(disMin[x],val[to]);
if(!vis[to]){
vis[to] = true;
q.push(to);
}
}
}
}
}
void spfa2(){
memset(vis,0,sizeof vis);
memset(disMax,-1,sizeof disMax);
queue<int> q;
q.push(n);
vis[n] = 1;
disMax[n] = val[n];
while(!q.empty()){
auto x = q.front();
q.pop();
vis[x] = 0;
for(int i=0;i<h[x].size();i++){
int to = h[x][i];
if(disMax[to] < disMax[x]) {
disMax[to] = max(disMax[x],val[to]);
if (!vis[to]) {
vis[to] = 1;
q.push(to);
}
}
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>val[i];
for(int i=1;i<=m;i++){
int x,y,z;
cin>>x>>y>>z;
if(z == 2){
g[x].push_back(y);
g[y].push_back(x);
h[x].push_back(y);
h[y].push_back(x);
}else{
g[x].push_back(y);
h[y].push_back(x);
}
}
spfa();
spfa2();
int res = 0;
for(int i=1;i<=n;i++){
res = max(res,disMax[i] - disMin[i]);
}
cout<<res;
}
单源最短路模型,跑的spfa,反向再建个新图
在原图 跑从1 到 x dis[x] 的最小值
在反图 跑从 n 到 x dis [x] 的最大值
——————————————————————
初始化的时候,得设置成无穷,如果直接设置成val ,就有可能转移不出去
————————————————————————
对于要找的最值,考虑他是从起点去寻找,还是从终点去寻