您的位置:首页 > 理论基础 > 计算机网络

网络流算法

2016-07-26 10:00 459 查看
Dinic算法

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: