uva 1658 Admiral (最小費最大流)

2022-07-23 21:30:41 字數 1331 閱讀 3574

題目大意:在圖中找出兩條沒有交集的線路,要求這兩條線路的費用最小。

解題思路:還是拆點建圖的問題。

首先每乙個點都要拆成兩個點。比如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...