【dijkstra求MCFC】

使用势能函数解决问题。
因为边权为负时无法使用 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;
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值