題意:給出乙個v個點e條邊的有向加權圖,求1~v的兩條不相交(除了起點和終點外公共點)的路徑,使得權和最小。
思路:把2到v-1的每個點拆分為兩個節點,容量為1,也就是只可以用一次,費用為0,然後求1到v的流量為2的最小費用流。
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7using
namespace
std;89
const
int maxn = 10000 + 5;10
const
int inf = 0x3f3f3f3f;11
12 typedef long
long
ll;13
14struct
edge
18};
1920
struct
mcmf
2136
37void addedge(int
from, int to, int cap, int
cost)
3845
46bool bellmanford(int s, int t, int &flow, ll &cost)
4764}65
}66}67
if (d[t] == inf) return
false
;68 flow +=a[t];
69 cost += (ll)d[t] *(ll)a[t];
70for (int u = t; u != s; u = edges[p[u]].from)75
return
true;76
}7778void mincostmaxdflow(int s, int t, int limit, ll &cost)
83}t;
8485
intmain()
8696
for (int i = 0; i)
97105
ll cost;
106 t.mincostmaxdflow(0, n - 1, 2
, cost);
107 printf("
%lld\n
", cost);
108}
109return0;
110 }
UVA 1658 Admiral 海軍上將
題目大意 給出乙個v 3 v 1000 個點e 3 e 10000 條邊的有向加權圖,求1 v的兩條不相交 除了起點和終點外沒有公共點 的路徑,使得權和最小。如圖11 15所示,從1到6的兩條最優路徑為1 3 6 權和為33 和1 2 5 4 6 權和為53 摘自 劉汝佳演算法競賽入門經典 方法 將...
uva 1658 Admiral (最小費最大流)
題目大意 在圖中找出兩條沒有交集的線路,要求這兩條線路的費用最小。解題思路 還是拆點建圖的問題。首先每乙個點都要拆成兩個點。比如a點拆成a a 起點和終點的兩點間的容量為2費用為0,保證了僅僅找出兩條線路。其餘點的容量為1費用為0,保證每點僅僅走一遍,兩條線路無交集。然後依據題目給出的要求繼續建圖。...
uva10806 (最小費用最大流)
題意 從1到n 再從n到1 不經過重複的邊 如果是點就是旅行商問題了 問最短路 思路 最小費用最大流 建立乙個超級源 它的容量為2,到第乙個點的費用為0 然後每個連線的點的容量為1 只要找出兩條最小費用的路 那麼就可以了。include using namespace std include inc...