Rt,参照了某篇题解的思路,但是全WA了
#include<bits/stdc++.h>
#define PII pair<int,int>
typedef long long int ll;
using namespace std;
const int maxn=2e5+10,INF=0x7fffffff;
int n,m,s,x,y,z,u,v,ans=INT_MIN,t[maxn];
int cnte,fire[maxn],dise[maxn];
int cntE,firE[maxn],disE[maxn];
bool booke[maxn];
bool bookE[maxn];
priority_queue< PII,vector< PII >,greater< PII > >q;
struct node{
int to,w,nxt;
}e[maxn],E[maxn];
void add_edgee(int a,int b){
e[++cnte].to=b;
e[cnte].nxt=fire[a];
fire[a]=cnte;
}
void add_edgeE(int a,int b){
E[++cntE].to=b;
E[cntE].nxt=firE[a];
firE[a]=cntE;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>t[i];
for(int i=1;i<=m;i++){
cin>>x>>y>>z;
add_edgee(x,y);
add_edgeE(y,x);
if(z==2){
add_edgee(y,x);
add_edgeE(x,y);
}
}
s=1;
for(int i=1;i<=n;i++)dise[i]=INF,booke[i]=0;
dise[s]=0;
q.push(make_pair(0,s));
while(!q.empty()){
u=q.top().second;
q.pop();
if(booke[u])continue;
booke[u]=1;
for(int i=fire[u];i;i=e[i].nxt){
v=e[i].to;
if(!booke[v]&&dise[v]>dise[u]){
dise[v]=min(dise[u],t[v]);
q.push(make_pair(dise[v],v));
}
}
}
s=n;
for(int i=1;i<=n;i++)disE[i]=INF,bookE[i]=0;
disE[s]=0;
q.push(make_pair(0,s));
while(!q.empty()){
u=q.top().second;
q.pop();
if(bookE[u])continue;
bookE[u]=1;
for(int i=firE[u];i;i=E[i].nxt){
v=E[i].to;
if(!bookE[v]&&disE[v]<disE[u]){
disE[v]=max(disE[u],t[v]);
q.push(make_pair(disE[v],v));
}
}
}
for(int i=1;i<=n;i++)ans=max(ans,disE[i]-dise[i]);
cout<<ans;
return 0;
}
/*
5 5
4 3 5 6 1
1 2 1
1 4 1
2 3 2
3 5 1
4 5 2
*/