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

网络流

2016-06-30 21:37 525 查看

SAP

代码

struct edge{

int v, r, flow;
edge(int v, int flow, int r) : v(v), flow(flow), r(r) {}
};
vector<edge> mp[maxn];

void add_edge(int u, int v, int flow){

mp[u].push_back(edge(v, flow, mp[v].size()));
mp[v].push_back(edge(u, 0, mp[u].size() - 1));
}

int maxflow, disq[maxn], dist[maxn];
int sap(int u, int nowflow){

if(nowflow == 0 || u == T) return nowflow;

int tempflow, deltaflow = 0;
for(int l = 0; l < mp[u].size(); ++l){
int v = mp[u][l].v;
if(mp[u][l].flow > 0 && dist[u] == dist[v] + 1){
tempflow = sap(v, min(nowflow - deltaflow, mp[u][l].flow));
mp[u][l].flow -= tempflow;
mp[v][mp[u][l].r].flow += tempflow;
deltaflow += tempflow;
if(deltaflow == nowflow || dist[S] >= T) return deltaflow;
}
}
disq[dist[u]]--;
if(disq[dist[u]] == 0) dist[S] = T;
dist[u]++;
disq[dist[u]]++;
return deltaflow;
}

int main(){

while(dist[S] < T) maxflow += sap(S, inf);
}


费用流

代码

struct edge{

int v, r, cost, flow;
edge(int v, int flow, int cost, int r) : v(v), flow(flow), cost(cost), r(r) {}
};
vector<edge> mp[maxn];

void add_edge(int u, int v, int flow, int cost){

mp[u].push_back(edge(v, flow, cost, mp[v].size()));
mp[v].push_back(edge(u, 0, -cost, mp[u].size() - 1));
}

int S, T, maxflow, mincost;
int dist[maxn], pth[maxn], lnk[maxn];
bool inq[maxn];
queue<int> que;
bool find_path(){

for(int i = 1; i <= T; ++i) dist[i] = inf;
dist[S] = 0;
que.push(S);
while(!que.empty()){
int u = que.front();
que.pop();
inq[u] = false;
for(int l = 0; l < mp[u].size(); ++l){
int v = mp[u][l].v;
if(mp[u][l].flow > 0 && dist[v] > dist[u] + mp[u][l].cost){
dist[v] = dist[u] + mp[u][l].cost;
pth[v] = u;
lnk[v] = l;
if(!inq[v]){
inq[v] = true;
que.push(v);
}
}
}
}
if(dist[T] < inf) return true;
else return false;
}

void adjust(){
int deltaflow = inf, deltacost = 0;
for(int v = T; v != S; v = pth[v]){
deltaflow = min(deltaflow, mp[pth[v]][lnk[v]].flow);
deltacost += mp[pth[v]][lnk[v]].cost;
}
maxflow += deltaflow;
mincost += deltaflow * deltacost;
for(int v = T; v != S; v = pth[v]){
mp[pth[v]][lnk[v]].flow -= deltaflow;
mp[mp[pth[v]][lnk[v]].v][mp[pth[v]][lnk[v]].r].flow += deltaflow;
}
}

int main(){

while(find_path()) adjust();

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  图论 网络流 费用流