
相比dij,spfa优点是可处理含负边不含负圈的最短路问题,缺点是算法复杂度不太好【貌似可以使用两种优化。LLL和SLF】
差分约束就是将一些不等式转化为图中的带权边,然后求解最短路或最长路的方法
洛谷P1645https://www.luogu.org/problemnew/show/P1645
#include<bits/stdc++.h>
using namespace std;
struct pot{
int to;
int next;
int len;
}edge[];
queue<int>pq;
int vis[];
int next[];
int dist[];
void add(int x,int y,int z,int t){
edge[t].len=z;
edge[t].next=next[x];
edge[t].to=y;
next[x]=t;
}
void spfa(int x)
{
while(!pq.empty())pq.pop();
dist[x]=;
vis[x]=true;
pq.push(x);
while(!pq.empty()){
int u=pq.front();
pq.pop();
vis[u]=false;
for(int i = next[u]; i != - ; i=edge[i].next)
{
int w=edge[i].to;
if(dist[w]<dist[u]+edge[i].len)
{
dist[w]=dist[u]+edge[i].len;
if(!vis[w]){
vis[w]=true;
pq.push(w);
}
}
}
}
}
int main()
{
int n;
scanf("%d",&n);
int tot=;
int mmax=;
int mmin=;
memset(dist,-,sizeof(dist));
memset(next,-,sizeof(next));
memset(vis,,sizeof(vis));
for(int i = ; i < n ; i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
add(a-,b,c,tot);
if(a<mmin)mmin=a;
if(mmax<b)mmax=b;
tot++;
}
for(int i = mmin ; i <= mmax ; i++)
{
add(i-,i,,tot);
tot++;
add(i,i-,-,tot);
tot++;
}
spfa(mmin-);
cout << dist[mmax]<<endl;
return ;
}