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

网络流增广路(无费用)模板

2016-06-16 23:31 330 查看
紫书上的模板~

有很多新写法,以前没有见过呐~

struct Edge{
int from,to,cap,flow;
Edge(int u,int v,int c,int f):
from(u),to(v),cap(c),flow(f) {}  //有冒号,无分号,有花括号
};

struct EdmondsKarp{
int n,m;
vector<Edge> edges;
vector<int> G[maxn];
int a[maxn];
int p[maxn];

void init(int n)
{
for(int i=0;i<n;i++) G[i].clear();
edges.clear();
}

void AddEdge(int from,int to,int cap)
{
edges.push_back(Edge(from,to,cap,0));
edges.push_back(Edge(to,from,0,0));
m=edges.size();
G[from].push_back(m-2);
G[to].push_back(m-1);
}

int MaxFlow(int s,int t)
{
int flow=0;
for(;;)
{
memset(a,0,sizeof(a));
queue<int> q;
q.push(s);a[s]=INF;  //要加要加要加~
while(!q.empty())
{
int z=q.front();q.pop();
for(int i=0;i<G[z].size();i++)
{
Edge e=edges[G[z][i]];
if(!a[e.to] && e.cap>e.flow)
{
a[e.to]=min(a[z],e.cap-e.flow);
p[e.to]=G[z][i];q.push(e.to);
}
}
if(a[t]) break;
}
if(!a[t]) break;
for(int i=t;i!=s;i=edges[p[i]].from)
{
edges[p[i]].flow+=a[t];
edges[p[i]^1].flow-=a[t];
}
flow+=a[t];
}
return flow;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ 网络流