zkw费用流
2016-04-24 17:40
232 查看
//zkw费用流 #include <cstdio> #include <iostream> #include <cstring> using namespace std; const int MAXN = 20000 + 5; const int INF = 0x7f7f7f7f; int from[MAXN<<1],to[MAXN<<1],next[MAXN<<1],cap[MAXN<<1],cos[MAXN<<1]; int a[MAXN],q[MAXN],p[MAXN],d[MAXN],fst[MAXN],inq[MAXN]; int ecnt=1; inline void add(int f,int t,int c,int cc) { from[++ecnt]=f; to[ecnt]=t; cap[ecnt]=c; cos[ecnt]=cc; next[ecnt]=fst[f]; fst[f]=ecnt; } int main() { int s,t,n,m; scanf("%d%d",&m,&n); s=1;t=n; for(int i=1;i<=m;i++) { int a,b,c,d; scanf("%d%d%d%d",&a,&b,&c,&d); add(a,b,c,d); add(b,a,0,-d); } int flow=0,cost=0; while(true) { memset(d,0x7f,sizeof(d)); memset(inq,0,sizeof(inq)); d[s]=0;inq[s]=1;p[s]=0;a[s]=INF; int head=0,tail=0,cnt=0; q[tail++]=s; while(head<tail) { if(cnt>m)break;//minus circle int u=q[head++]; inq[u]=0; for(int i=fst[u]; i; i=next[i]) { if(cap[i]>0 && d[to[i]]>d[u]+cos[i]) { d[to[i]]=d[u]+cos[i]; p[to[i]]=i; a[to[i]]=min(a[u],cap[i]); if(!inq[to[i]]) { q[tail++]=to[i]; inq[to[i]]=1; } } } cnt++; } if(d[t]>=INF)break; flow+=a[t]; cost+=d[t]*a[t]; for(int u=t;u!=s;u=from[p[u]]) { cap[p[u]]-=a[t]; cap[p[u]^1]+=a[t]; } } printf("%d\n",cost); return 0; }
相关文章推荐
- k近邻算法(KNN)及kd树简介(KD-Tree)
- Spring官网下载dist.zip的几种方法
- 20145315 《Java程序设计》实验三实验报告
- 用户注册,重复用户名时的处理
- Docker数据管理(四)
- list.append()
- Python爬虫辅助利器PyQuery模块的安装使用攻略
- python函数(二)
- 服务器端Json生成及Android客户端的json解析
- UVALive 6442 Coins on a Ring(二分查找答案)
- OC 继承
- 初识HTML流水笔记
- C#_会员管理系统:开发六(数据搜索)
- 你的宽带ip地址被100.64了吗?
- LeetCode 189. Rotate Array
- FT检测算法检测
- 重构-改善既有代码设计 读书笔记
- 在C#中使用NPOI2.0操作Excel2003和Excel2007
- 所谓 Spinner 组件
- 添加LCD背光驱动