AcWing 341. 最优贸易 stl 双spfa
原题链接
中等
作者:
cc_25
,
2024-11-27 18:43:35
,
所有人可见
,
阅读 5
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define INF 0x3f3f3f3f3f3f3f3f
#define fi first
#define se second
#define all(_a) _a.begin(), _a.end()
typedef pair<int,int> PII;
const int N=1e6+10;
int n,m;
vector<int> h[N],rh[N];
int mx[N],mn[N],sb[N],st[N];
void spfa()
{
for(int i=1;i<=n;i++) mn[i]=INF;
mn[1]=sb[1];
queue<int> q;
q.push(1);
st[1]=1;
while(q.size())
{
int t=q.front();
q.pop();
st[t]=0;
for(auto it:h[t])
{
int hh=min(mn[t],sb[it]);
if(mn[it]>hh)
{
mn[it]=hh;
if(st[it]==0){
q.push(it);
st[it]=1;}
}
}
}
}
void spfa1()
{
mx[n]=sb[n];
queue<int> q;
q.push(n);
st[n]=1;
while(q.size())
{
int t=q.front();
q.pop();
st[t]=0;
for(auto it:rh[t])
{
int hh=max(mx[t],sb[it]);
if(mx[it]<hh)
{
mx[it]=hh;
if(st[it]==0){
q.push(it);
st[it]=1;}
}
}
}
}
void solve(){
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>sb[i];
for(int i=1;i<=m;i++)
{
int x,y,op;
cin>>x>>y>>op;
if(op==1)
{
h[x].push_back(y);
rh[y].push_back(x);
}else{
h[x].push_back(y);
h[y].push_back(x);
rh[x].push_back(y);
rh[y].push_back(x);
}
}
spfa();spfa1();
for(int i=1;i<=n;i++) st[i]=0;
int big=-1;
for(int i=1;i<=n;i++)
{
big=max(big,mx[i]-mn[i]);
}
cout<<big<<endl;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(nullptr), cout.tie(nullptr);
int T;
T=1;
while(T--)solve();
return 0;
}