https://vijos.org/p/1754
蛤蛤 只是因为做过类似的题 才会做的。。。
三次bfs 蛤蛤
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstdio>
#include<queue>
using namespace std;
int n,m,x,y,z,ans;
int c[100010],val[100010],used1[100010],used2[100010],w[100010];
vector<int>graph[100010];
vector<int>graph1[100010];
queue<int>q;
void bfs1(int a,int num)
{
q.push(a);
while(!q.empty())
{
int u=q.front();
q.pop();
if(val[u])
continue;
else val[u]=num;
for(int i=0;i<graph[u].size();i++)
{
int v=graph[u][i];
q.push(v);
}
}
}
void bfs2()
{
q.push(1);
while(!q.empty())
{
int u=q.front();
q.pop();
used1[u]=1;
for(int i=0;i<graph[u].size();i++)
{
int v=graph[u][i];
if(!used1[v])
q.push(v);
}
}
}
void bfs3()
{
q.push(n);
while(!q.empty())
{
int u=q.front();
q.pop();
used2[u]=1;
for(int i=0;i<graph1[u].size();i++)
{
int v=graph1[u][i];
if(!used1[v]||used2[v])
continue;
ans=max(ans,w[v]-val[v]);
q.push(v);
}
}
}
bool cp(int x,int y)
{
return w[x]<w[y];
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
scanf("%d",&w[i]);
c[i]=i;
}
sort(c+1,c+n+1,cp);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
if(z==1)
{
graph[x].push_back(y);
graph1[y].push_back(x);
}
if(z==2)
{
graph[x].push_back(y);
graph[y].push_back(x);
graph1[x].push_back(y);
graph1[y].push_back(x);
}
}
for(int i=1;i<=n;i++)
{
bfs1(c[i],w[c[i]]);
}
bfs2();
bfs3();
cout<<ans<<endl;
return 0;
}