
POJ - 2516 Minimum Cost 费用流,拆图
q; memset(dis,0x3f,sizeof(dis)); memset(inque,0,sizeof(inque)); q.push(s); dis[s]=0; inque[s]=1; incf[s]=inf; while(q.size()){ int u=q.front();q.pop(); inque[u]=0; for(int i=head[u];~i;i=edge[i].next){ if(!edge[i].flow) continue; int v=edge[i].v; if(dis[v]>dis[u]+edge[i].w){ dis[v]=dis[u]+edge[i].w; incf[v]=min(incf[u],edge[i].flow); pre[v]=i; if(!inque[v]){ q.push(v); inque[v]=1; } } } } if(dis[t]==inf) return 0; return 1; } void MCMF(){ while(spfa()){ int x=t; maxflow+=incf[t]; mincost+=dis[t]*incf[t]; int i; while(x!=s){ i=pre[x]; edge[i].flow-=incf[t]; edge[i^1].flow+=incf[t]; x=edge[i^1].v; } } } int dian[55][55];//dian i j i店j货物所需 int ku[55][55];//ku i j i库j货物拥有 int val[55][55][55];//val w i j w货物从j库到i店所需 signed main(){ while(scanf("%d%d%d",&n,&m,&k)==3){ int ans=0; if(!n&&!m&&!k) break; for(int i=1;i<=n;i++){ for(int j=1;j<=k;j++){ scanf("%d",&dian[i][j]); } } for(int i=1;i<=m;i++){ for(int j=1;j<=k;j++) scanf("%d",&ku[i][j]); } for(int w=1;w<=k;w++){ for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&val[w][i][j]); } for(int _=1;_<=k;_++){ int need=0; init(); s=n*m+1000,t=s+1; //向汇点连边 for(int i=1;i<=n;i++){ need+=dian[i][_]; add(i,t,dian[i][_],0); add(t,i,0,0); } //源点连边 for(int i=1;i<=m;i++){ add(s,i+n,ku[i][_],0); add(i+n,s,0,0); } //市场-店面 for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ add(n+j,i,ku[j][_],val[_][i][j]); add(i,n+j,0,-val[_][i][j]); } } MCMF(); if(maxflow!=need){ //满足不了 ans=-1; break; } else ans+=mincost; } printf("%d\n",ans); } }
发布日期:2021-05-10 11:28:37
浏览次数:17
分类:精选文章
本文共 2797 字,大约阅读时间需要 9 分钟。
题目链接
题意
n个店铺,从m个市场进货,k种货物。给定市场k种货物存量,店铺k种货物需求,运输花费,问是否能满足要求,最小花费是多少
思路
费用流没得跑,就看如何建图
我一开始是一次性建图,出现以下几个问题
- 点编号太难了,一一对应很费脑子
- 边太多了,MCMF超时
看别的博客知道了要拆成k张图,对k种货物一一处理。因为我们需要满足所有需求,也就是必须满流,所以可以独立得拆成k张图,拆了之后发现建图简单了一个量级,按部就班建图就可以了
数据
来源POJ讨论区,感谢前辈们提供数据
input
1 3 3
1 1 1 0 1 1 1 2 2 1 0 1 1 2 3 1 1 1 2 1 1
1 1 1
3 2 20
2 4 3
0 2 3 2 3 4 1 0 2 1 0 3 0 2 4 2 3 0 2 3 1 2 1 2 3 1 1 1 2 3 2 1 3 1 2 2 3 1 2 3 4 1
2 2 1
1 1 1 1 1 2 2 100
2 4 5
2 1 2 2 2 1 1 1 2 1 2 2 2 2 2 2 1 2 1 1 2 2 2 2 1 1 2 2 2 1 1 1 6 7 5 5 2 9 4 6 6 9 9 1 9 1 7 4 1 7 4 4 7 3 5 4 7 7 9 1 3 8 8 8 2 7 1 4 7 1
1 2 3
1 1 2 2 2 1 2 1 1 7 4 4 1 7 3 0 0 0
output:
4
-1 27 4 38 15
代码
#include#include #include #include
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年04月19日 15时18分52秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
比特币回调至6000美元?分析师表示“很有可能”
2021-05-10
数字印钞界迎来重磅精英机构,普通人还有翻身机会吗? | 加密货币与阶层穿越...
2021-05-10
Java初识和开发环境搭建
2021-05-10
Wordpress主题Git后台清净模式设置
2021-05-10
张一鸣:创业7年,我经历的5件事
2021-05-10
SQL基础语法
2021-05-10
SQL 已死,但 SQL 将永存
2021-05-10
Python3 日期和时间
2021-05-10
JavaScript实现表格排序
2021-05-10
vue散碎知识点学习
2021-05-10
git拉取远程指定分支代码
2021-05-10
C语言--C语言总结大纲
2021-05-10
轻松理解前后端分离(通俗易懂)
2021-05-10
JavaFX官方文档
2021-05-10
ORA-12154: TNS: 无法解析指定的连接标识符
2021-05-10
Linux 激活网卡ifconfig eth1 up 和 ifup eth1 之间的差别
2021-05-10
In App Purchase Verification using PHP
2021-05-10
shell编程===》进程锁
2021-05-10
Linux小操作LVM
2021-05-10