題目大意:在圖中找出兩條沒有交集的線路,要求這兩條線路的費用最小。
解題思路:還是拆點建圖的問題。
首先每乙個點都要拆成兩個點。比如a點拆成a->a』。起點和終點的兩點間的容量為2費用為0,保證了僅僅找出兩條線路。其餘點的容量為1費用為0,保證每點僅僅走一遍,兩條線路無交集。然後依據題目給出的要求繼續建圖。每組資料讀入a, b, c, 建立a』到b的邊容量為1, 費用為c。圖建完之後,用bellman-ford來實現mcmf。
#include
#include
#include
#include
#include
#include
using
namespace
std;
typedef
long
long ll;
const
int n = 2005;
const
int inf = 0x3f3f3f3f;
int n, m, s, t;
int a[n], pre[n], d[n], inq[n];
struct edge;
vector
edges;
vector
g[n];
void init()
void addedge(int from, int to, int cap, int flow, ll cos) );
edges.push_back((edge));
int m = edges.size();
g[from].push_back(m - 2);
g[to].push_back(m - 1);
}void input()
addedge(n, 2 * n, 2, 0, 0);
int u, v;
ll c;
for (int i = 0; i < m; i++)
}int bf(int s, int t, int& flow, ll& cost)
}
}flag = 0;
}if (d[t] == inf) return
0; flow += a[t];
cost += (ll)d[t] * (ll)a[t];
for (int u = t; u != s; u = edges[pre[u]].from)
return1;}
int mcmf(int s, int t, ll& cost)
int main()
return
0;}
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(網路流經典拆點方法)
把每個點 除了1,n 之外拆成i和i1,兩點間連一條容量為1,費用為零的邊,這樣可以限定,每個點只被跑到一次,那麼之後跑乙個最流量為2的最小費用流就可以了。至於其他邊,流量設為1,保證每個邊只被跑到一次。pragma comment linker,stack 1024000000,102400000...
UVa 1658 海軍上將(最小費用最大流)
題意 給出乙個v個點e條邊的有向加權圖,求1 v的兩條不相交 除了起點和終點外公共點 的路徑,使得權和最小。思路 把2到v 1的每個點拆分為兩個節點,容量為1,也就是只可以用一次,費用為0,然後求1到v的流量為2的最小費用流。1 include 2 include 3 include 4 inclu...