两次dfs(博主懒,懒得写SPFA或者bfs)分别求出从起点开始到点 i i 水晶球最小价格,以及从终点开始到点 i i 的水晶球最大价格,然后减一下最大的就是答案辣~
我丑陋的代码
#include<bits/stdc++.h>
using namespace std;
const int N=100002;
int n,m,mx[N],mn[N],b[N],ans,v[N];
vector<int> a[N],g[N];
void read(int &x){
char ch=getchar();x=0;
for(;ch<'0'||ch>'9';ch=getchar());
for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<3)+(x<<1)+ch-'0';
}
void dfs1(int x){
mn[x]=min(mn[x],v[x]);
if (b[x]) return;
b[x]=1;
for(int i=0;i<a[x].size();i++) mn[a[x][i]]=min(mn[a[x][i]],mn[x]),dfs1(a[x][i]);
}
void dfs2(int x){
mx[x]=max(mx[x],v[x]);
if (b[x]) return;
b[x]=1;
for(int i=0;i<g[x].size();i++) mx[g[x][i]]=max(mx[g[x][i]],mx[x]),dfs2(g[x][i]);
}
int main(){
// freopen("1.in","r",stdin);
// freopen("1.out","w",stdout);
read(n);read(m);
for(int i=1;i<=n;i++) read(v[i]);
for(int i=1;i<=m;i++){
int x,y,z;
read(x);read(y);read(z);
a[x].push_back(y);g[y].push_back(x);
if (z==2) a[y].push_back(x),g[x].push_back(y);
}
memset(mn,0x3f,sizeof mn);
dfs1(1);
memset(b,0,sizeof b);
dfs2(n);
for(int i=1;i<=n;i++) ans=max(ans,mx[i]-mn[i]);
cout<<ans;
return 0;
}