利用spfa的搜索,暴力更新每一个点的最大差价,和最小成本
对最短路不是很熟悉,开始写的时候把最大差价的初始值赋错了,汗

#include<bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
const int N=5e5+55;
const int M=1e5+55;
int head[N<<1],val[M];
int cnt;
struct node{
    int to,next;
}mp[N<<1];
struct nod{
    int maxn,minn;
}eg[M];
void add(int x, int y)
{
    mp[cnt].to=y;
    mp[cnt].next=head[x];
    head[x]=cnt++;
}
void Spfa()
{
    bool p[M];
    memset(p,false,sizeof(p));
    queue<int >q;
    q.push(1);
    p[1]=true;
    while(!q.empty()){
        int u=q.front();
        q.pop();
        p[u]=false;
        for(int i=head[u];~i;i=mp[i].next){
            int to=mp[i].to;
            if(eg[to].minn>eg[u].minn){
                eg[to].minn=eg[u].minn;
                if(!p[to]){
                    q.push(to);
                    p[to]=true;
                }
            }
            if(eg[to].maxn<val[to]-eg[to].minn){
                eg[to].maxn=val[to]-eg[to].minn;
                if(!p[to]){
                    q.push(to);
                    p[to]=true;
                }
            }
            if(eg[to].maxn<eg[u].maxn){
                eg[to].maxn=eg[u].maxn;
                if(!p[to]){
                    q.push(to);
                    p[to]=true;
                }
            }
        }
    }
}
int main() {
    int n, m, x, y, k;
    while (~scanf("%d%d", &n, &m)) {
        cnt = 0;
        memset(head, -1, sizeof(head));
        for (int i = 1; i <= n; ++i) {
            scanf("%d", &x);
            eg[i].maxn = -1;                     //要将初始值,赋为大于0的数,不然可能在第一次时不能将数据压入队列;
            eg[i].minn = x;
            val[i] = x;
        }
        for (int i = 0; i < m; ++i) {
            scanf("%d%d%d", &x, &y, &k);
            if (k == 1)
                add(x, y);
            else {
                add(x, y);
                add(y, x);
            }
        }
        Spfa();
        printf("%d\n", eg[n].maxn);
    }
    return 0;
}