最小費用最大流模板

2021-08-04 09:43:07 字數 1167 閱讀 3014

演算法實現過程:

1,每次查詢是否 存在源點到匯點的可增廣路徑,並用pre[ i ]記錄路徑上到達點i 的 邊 的編號。這裡的路徑指的是 —— 源點到匯點的最短路(邊權為費用) 且 路徑上所有邊都不能滿流;

2,若存在這樣的路徑,從匯點沿著pre陣列向前找,找到該路徑上可以增廣的流量min(當然是所有邊中剩餘流量最小的)。再從匯點遍歷一次,正向邊增加流量min,反向邊減少min,總費用累加min * edge[i].cost,總流量累加min。

//最小費用最大流模板,spfa實現

#include #include #include #include #define inf 0x3f3f3f3f

#define maxn 100005

using namespace std;

int n, m; //結點數, 邊數

int edgenum;

int head[maxn]; //鏈式前向星需要用到的陣列

int vis[maxn]; //記錄乙個點是否在佇列中

int dist[maxn]; //記錄最短路

int pre[maxn]; //記錄前驅邊

struct edge

edge[maxn];

//初始化

void init()

//加邊(注意反向邊)

void add_edge(int u, int v, int cap, int cost)

; edge[edgenum] = e1;

head[u] = edgenum++;

edge e2 = ;

edge[edgenum] = e2;

head[v] = edgenum++;

}//建圖

void creat_graph()

}} }

return pre[t]!=-1;

}void mcmf(int s, int t, int &cost, int &flow)

flow += flow_min;

for(int i=pre[t]; i!=-1; i=pre[edge[i^1].to]) //改變cost

}}int main()

return 0;

}

最小費用最大流模板

const int n 1010 點 const int m 2 10010 邊 const int inf 1000000000 struct nodee m int next1 m point n dis n q n pre n ne ne為已新增的邊數,next,point為鄰接表,dis為花...

最小費用最大流模板

一 最小費用最大流的模型 在保證流量最大的前提下,所需的費用最小,這就是最小費用最大流問題 帶有費用的網路流圖 g v,e,c,w v 頂點 e 弧 c 弧的容量 w 單位流量費用。任意的弧對應非負的容量c i,j 和單位流量費用w i,j 滿足 流量f是g的最大流。在f是g的最大流的前提下,流的費...

最小費用最大流 模板

因為含有負權邊,所以使用spfa進行增廣。指定流量的最小費用流可以初始化乙個f,然後每次一直迴圈到f 0為止。函式返回的是最大流,當然經過少量修改可以返回最小費用,利用最小流量乘以相應的費用即可。prevv記錄父節點,preve記錄當前節點對應父節點的第幾條邊。const int inf 0x3ff...