关于建边,如果需要求最小值(即最长路),一开始的话add(v,u,-w);
另外如果xi-xj<=k,那么建边(j,i,k)这个样子。
推荐博客:https://blog.csdn.net/consciousman/article/details/53812818
洛谷P5960:https://www.luogu.com.cn/problem/P5960
#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,n,a) for(int i=n;i>=a;i--)
#define endl '\n'
#define eps 0.000000001
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a))
#define IO ios::sync_with_stdio(false);cin.tie(0);
using namespace std;
const int INF=0x3f3f3f3f;
const ll inf=0x3f3f3f3f3f3f3f3f;
const int mod=1e9+7;
const int maxn=1e5+5;
int tot,head[maxn];
struct E{
int to,next,w;
}edge[maxn<<1];
void add(int u,int v,int w){
edge[tot].to=v;
edge[tot].w=w;
edge[tot].next=head[u];
head[u]=tot++;
}
int n,m;
int d[maxn],inq[maxn],cnt[maxn];
bool SPFA(int s){
queue<int> q;
q.push(s);d[s]=0,inq[s]=1;
while(!q.empty()){
int now=q.front();q.pop();
inq[now]=0;
for(int i=head[now];i!=-1;i=edge[i].next){
int v=edge[i].to;
if(d[v]>d[now]+edge[i].w){
d[v]=d[now]+edge[i].w;
cnt[v]=cnt[now]+1;
if(cnt[v]>=n) return true;
if(inq[v]==1) continue;
q.push(v);
}
}
}
return false;
}
int main(){
cin>>n>>m;mem(head,-1);
rep(i,1,m){
int u,v,w;cin>>u>>v>>w;
add(v,u,w);
}
rep(i,1,n) add(0,<