利用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;
}


京公网安备 11010502036488号