題意
傳送門 aoj 2230
題解求在保持起點、終點最大距離不變的條件下增加的最大邊權值。增加邊權後,對於圖中每一條邊,經過它的最長邊都要保證小於等於最大距離。從終點向起點連邊,問題轉化為求最大費用迴圈流。
此時將原圖所有邊權取負,終點向起點連邊權值為最大距離,目標為原圖任一條邊都取到時,圖中正圈權值的最小和。按照 最小費用迴圈流
的思路連邊。但一般的最小費用迴圈流在假定取負權邊時,不僅將負權邊權值加入答案,而且令原圖負權邊滿流,使負權邊流量有回退的可能;而這裡要求圖中所有邊都要取到,故不預先令負權邊滿流。此時最小費用流即答案。
#include
#include
#include
#include
#include
#include
#define min(a,b) (((a) < (b)) ? (a) : (b))
#define max(a,b) (((a) > (b)) ? (a) : (b))
#define abs(x) ((x) < 0 ? -(x) : (x))
#define inf 0x3f3f3f3f
#define delta 0.85
#define eps 1e-10
#define pi 3.14159265358979323846
using
namespace std;
#define max_v 102
struct edge};
int v;
vector g[max_v]
;int h[max_v]
, dist[max_v]
;int prevv[max_v]
, preve[max_v]
;bool inq[max_v]
;void
add_edge
(int from,
int to,
int cap,
int cost)
intmin_cost_flow
(int s,
int t,
int f)}}
}for
(int v =
0; v < v; v++
) h[v]
= dist[v]
;while
(f >0)
}}if(dist[t]
== inf)
for(
int v =
0; v < v; v++
) h[v]
+= dist[v]
;int d = f;
for(
int v = t; v != s; v = prevv[v]
) f -
= d;
res +
= d * h[t]
;for
(int v = t; v != s; v = prevv[v])}
return res;
}void
clear_graph()
intspfa
(int s,
int t)}}
}return dist[t];}
#define max_n 100
#define max_m 1000
int n, m;
int x[max_m]
, y[max_m]
, s[max_m]
;int deg[max_n]
;// deg[i] > 0, in_degree > out_degree
void
solve()
for(
int i =
0; i < n; i++)if
(deg[i]
<0)
}add_edge
(n -1,
0, inf,
-spfa(0
, n -1)
);res +
=min_cost_flow
(s, t, f)
;printf
("%d\n"
, res);}
intmain()
solve()
;}return0;
}
最小費用流
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 namespa...
最小費用流
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...