网络流算法
2016-07-26 10:00
459 查看
Dinic算法
View Code
struct edge { int u,v; int cap,flow,cost; edge(int u=0,int v=0,int cap=0,int flow=0,int cost=0) :u(u),v(v),cap(cap),flow(flow),cost(cost){} }save[4*maxn*maxn]; struct MFMC { int n,edge_num; vector<int> G[maxn]; void init(int nn) { n=nn; edge_num=0; for(int i=0;i<=n;i++) G[i].clear(); } void addedge(int u,int v,int cap,int cost) { int a=edge_num++; int b=edge_num++; save[a]=edge(u,v,cap,0,cost); save[b]=edge(v,u,0,0,-cost); G[u].push_back(a); G[v].push_back(b); } int add[maxn],C[maxn]; int fa[maxn]; bool inq[maxn]; void clr(int s) { for(int i=0;i<=n;i++) add[i]=0,inq[i]=false,C[i]=INF; add[s]=INF; inq[s]=true; C[s]=0; fa[s]=0; } int solve(int s,int t) { int cnt=0,ret=0; while(true) { clr(s); queue<int> que; que.push(s); while(!que.empty()) { int u=que.front(); que.pop(); inq[u]=false; int Size=G[u].size(); for(int i=0;i<Size;i++) { int edge_id=G[u][i]; edge& e=save[edge_id]; int v=e.v; int cap=e.cap,flow=e.flow,cost=e.cost; if(cap>flow&&C[v]>C[u]+cost) { C[v]=C[u]+cost; fa[v]=edge_id; add[v]=min(add[u],cap-flow); if(!inq[v]){ inq[v]=true; que.push(v); } } } } if(!add[t]) break; cnt+=add[t]; ret+=add[t]*C[t]; for(int st=t;st!=s;st=save[fa[st]].u) { int a=fa[st],b=fa[st]^1; save[a].flow+=add[t]; save[b].flow-=add[t]; } } return ret; } };
View Code
相关文章推荐
- UI网络笔记(五):UI网络之上拉和下拉的四种方式
- UI网络笔记(四):UI网络之解析XML数据的三种方式
- UI网络笔记(三):UI网络之图片的上传和下载
- UI网络笔记(二):UI网络之Post同步和异步的密文请求
- UI网络笔记(一):UI网络之Get同步和异步的明文请求
- 网络带宽查看并找出占用大的进程
- HTTP的缓存控制
- CentOS搭建SVN(HTTP)
- 【HTTP1.1中文手册】
- asp.net继承IHttpHandler接口实现给网站图片添加水印功能实例
- bzoj 1834 网络扩容 (费用流)
- 错误提示为: Can not find the tag library descriptor for "http://java.sun.com/jsp/jstl/core"
- httpd2.2和httpd2.4虚拟主机的实现
- 通过Fidder抓取手机端网络数据包
- httpd
- http协议详解
- VMware连接网络的方式详细介绍
- fuhome实现微信语音控制单片机设备,任何网络设备均可
- HTTP Keep-Alive 详解
- 【转】聊聊HTTPS和SSL/TLS协议