双向bfs第一次求最短路,第二次求最长路,两次的值取差。
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <vector>
#include <queue>
#include <iostream>
using namespace std;
#define maxn 110000
#define pb(a) push_back(a);
int getint()
{
int res=0;
char c;
while(c=getchar(),c<'0'||c>'9');
res=c-'0';
while(c=getchar(),c>='0'&&c<='9')
res=res*10+c-'0';
return res;
}
int n,m,pric[maxn],vis[maxn],val1[maxn],val2[maxn];
vector<int>g1[maxn],g2[maxn];
void bfs1()
{
queue<int>q;
memset(vis,0,sizeof(vis));
val1[1]=pric[1];
vis[1]=1;
q.push(1);
int now,next;
while(!q.empty())
{
now=q.front();
q.pop();
vis[now]=0;
for(int i=0;i<g1[now].size();i++)
{
next=g1[now][i];
if(val1[next]>min(val1[now],pric[next]))
{
val1[next]=min(val1[now],pric[next]);
if(!vis[next])
{
vis[next]=1;
q.push(next);
}
}
}
}
}
void bfs2()
{
queue<int>q;
memset(vis,0,sizeof(vis));
val2[n]=pric[n];
vis[n]=1;
q.push(n);
int now,next,tot;
while(!q.empty())
{
now=q.front();
q.pop();
vis[now]=0;
for(int i=0;i<g2[now].size();i++)
{
next=g2[now][i];
if(val2[next]<max(val2[now],pric[next]))
{
val2[next]=max(val2[now],pric[next]);
if(!vis[next])
{
vis[next]=1;
q.push(next);
}
}
}
}
}
int main()
{
scanf("%d%d",&n,&m);
rep(i,1,n)
{
pric[i]=getint();
}
int a,b,c;
rep(i,1,m)
{
a=getint();
b=getint();
c=getint();
if(c==1)
{
g1[a].pb(b);
g2[b].pb(a);
}
else
{
g1[a].pb(b);
g1[b].pb(a);
g2[a].pb(b);
g2[b].pb(a);
}
}
memset(val2,0,sizeof(val2));
memset(val1,0x3f3f3f3f,sizeof(val1));
bfs1();
bfs2();
int ans=0;
for(int i=1;i<=n;i++)
{
ans=max(ans,val2[i]-val1[i]);
}
printf("%d",ans);
return 0;
}