演算法實現過程:
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...