E.游走配对(费用流)
发布日期:2021-06-30 10:28:30 浏览次数:2 分类:技术文章

本文共 963 字,大约阅读时间需要 3 分钟。

非常水的网络流

看到这么多限制,还有变化的边权…网络流没跑了

每个点拆分为入点和出点,中间连 q q q条权值为 a [ i ] + j ∗ b [ i ] a[i]+j*b[i] a[i]+jb[i]的边,其中 j ∈ [ 0 , q − 1 ] j\in[0,q-1] j[0,q1]

源点连向 x x x的入点

y y y的出点连向汇点,跑最小费用即可

#include 
using namespace std;const int inf = 1e9;const int maxn = 3e6+10;struct edge{
int to,nxt,flow,w;}d[maxn]; int head[maxn],cnt=1;void add(int u,int v,int flow,int w){
d[++cnt] = (edge){
v,head[u],flow,w},head[u] = cnt; d[++cnt] = (edge){
u,head[v],0,-w},head[v] = cnt;}int incf[maxn],pre[maxn],s,t,dis[maxn],vis[maxn],n,m,q,a[maxn],b[maxn];bool spfa(){
queue
q; q.push( s ); for(int i=0;i<=t;i++) dis[i] = inf, vis[i] = 0; incf[s] = inf; vis[s] = 1; dis[s] = 0; while( !q.empty() ) {
int u = q.front(); q.pop(); vis[u] = 0; for(int i=head[u];i;i=d[i].nxt ) {
int v = d[i].to; if( dis[u]+d[i].w
> n >> m >> q; s = 0,t = n+n+1; for(int i=1;i<=n;i++) cin >> a[i] >> b[i]; for(int i=1;i<=n;i++) {
for(int j=0;j

转载地址:https://issue-is-vegetable.blog.csdn.net/article/details/113653588 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:牛客练习赛65 D.最小公倍数(分组背包)
下一篇:P3224 [HNOI2012]永无乡(线段树合并)

发表评论

最新留言

关注你微信了!
[***.104.42.241]2024年04月16日 15时29分21秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章