使用势能函数解决问题。
因为边权为负时无法使用 dijkstra 求最短路,所以我们要使最短路不被改变的情况下使边权变为正。
不能直接加边,因为路径的边数不同。
可以证明当 h[i]=dis[i] 时 dis’[t]=dis[t]-h[t]。
当有反向边加入时依然成立。
那么先用一次 SPFA 求出原始 dis 即可。
code:
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
#define int long long
#define db double
const int MAXN=5e3+5;
const int MAXM=2e5+5;
const int INF=0x3f3f3f3f;
int n,m,ca[MAXM],cnt=1,head[MAXN],dis[MAXN],pre[MAXN],mf,mc,inc[MAXN],st=0,en,h[MAXN],s,t;
db Ans;
bool vis[MAXN];
struct EDG{
int nxt,to,z;
}a[MAXM];
struct ren{
int v,val;
ren(){
};
ren(int V,int Val){
v=V;val=Val;
}
bool operator<(const ren &a)const{
return val>a.val;
}