最小費用流

2021-06-05 07:13:26 字數 1487 閱讀 6055

#include #include #define maxn 61

#define maxv (maxn*maxn*2 + 1)

#define maxe (maxv*5)

#define oo 2147483647

#define min(a,b) ((a>(b)?(b):(a)))

#define maxq maxe

using namespace std;

struct edge_type

;int n,m;

int a[maxn + 1][maxn + 1];

int total,totalv,source,sink;

int first[maxv + 1];

edge_type g[maxe + 1];

int dist[maxv + 1],fa[maxv + 1];

bool mark[maxv + 1];

int q[maxq + 1];

bool spfa()}}

head ++;

if (head>maxq) head = 1;

}return dist[sink]>=0;

}int mincost_maxflow()

printf("\n");*/

cur_flow = oo; cur_cost = 0;

for (int temp=fa[sink];temp;temp=fa[g[temp].x])

for (int temp=fa[sink];temp;temp=fa[g[temp].x])

// printf("%d\n",cur_flow);

total_flow += cur_flow;

total_cost += cur_cost*cur_flow;

}// printf("%d\n",total_flow);

return total_cost;

}void add(int x,int y,int flow,int cost)

int main()

total = 0;

memset(first,0,sizeof(first));

source = n*n*2 + 1;

totalv = source;

sink = n*n*2;

add(source,1,m,0);

for (int i=1;i<=n;i++){

for (int j=1;j<=n;j++){

add((i - 1)*n + j,(i - 1)*n + j + n*n,1,a[i][j]);

add((i - 1)*n + j,(i - 1)*n + j + n*n,oo,0);

if (i

最大費用最大流和最小費用最大流一樣可以用spfa + edmonds-karp解決。//顯然spfa可以求最長路的

貌似先用spfa找出一條增光路,再用ek增加流

有時間再研究研究

最小費用流

int v 頂點數 vector g max v int dist max v 最短距離 int prev max v 最短路中前驅結點對應的點 int pree max v 最短路中前驅結點對應的邊 void addedge int from,int to,int cap,int cost 求從s...

最小費用流

acm模版 最小費用流 o v e f init network g g.build v,e call g.mincost s,t flow g.flow cost g.cost 注意 spfa增廣,實際複雜度遠遠小於o v e define typef int type of flow defin...

最小費用流

單向圖 題目鏈結請點這裡 include 每次找費用的最短路,更新殘留網路圖直到找不到最短路為止 include 最大費用 權值取負值 結果取負值 include include include using namespace std const int inf 0x3f3f3f3f struct ...