網路流 網路擴容

2021-06-05 11:40:36 字數 3139 閱讀 5915

【問題描述】

給定一張有向圖,每條邊都有乙個容量c和乙個擴容費用w。這裡擴容費用是指將容量擴大1所需的費用。求:

1、 在不擴容的情況下,1到n的最大流;

2、 將1到n的最大流增加k所需的最小擴容費用。

【輸入格式】network.in

輸入檔案的第一行包含三個整數n,m,k,表示有向圖的點數、邊數以及所需要增加的流量。

接下來的m行每行包含四個整數u,v,c,w,表示一條從u到v,容量為c,擴容費用為w的邊。

【輸出格式】network.out

輸出檔案一行包含兩個整數,分別表示問題1和問題2的答案。

【輸入樣例】

5 8 2

1 2 5 8

2 5 9 9

5 1 6 2

5 1 1 8

1 2 8 7

2 5 4 9

1 2 1 1

1 4 2 1

【輸出樣例】

13 19

【資料規模】

30%的資料中,n<=100

100%的資料中,n<=1000,m<=5000,k<=10

這是一道最大流加最小費用流的問題。

最大流就不再多說了。

求出了最大流之後有個殘量網路,將這些邊的費用設為0(原圖中剩餘的流量免費),重新加入一些邊(前提是原圖中有這些邊,於是),流量為k,費用為擴容費用,再加乙個超級源,連一條容量為k,費用為0的邊(限制流量最大為k),最後求一次最小費用流即可。

accode:

#include #include #include #include #define min(a, b) ((a) < (b) ? (a) : (b))

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

const char fi = "network.in";

const char fo = "network.out";

const int maxn = 1010;

const int size = 0x3ff;

const int max = 0x3f3f3f3f;

const int min = ~max;

struct edge

;edge *edge[maxn];

edge *pre[maxn];

bool mp[maxn][maxn];

int w[maxn][maxn];

int d[maxn];

int cnt[maxn];

int q[size + 1];

int n, m, k, s = 1, t, f, r;

void init_file()

inline int getint()

inline void insert(int u, int v, int f, int c)

void readdata()

return;

}int sap(int u, int lim)

if (d[s] >= n) return tmp;

if ((--cnt[d[u]]) == 0) d[s] = n;

++cnt[++d[u]];

return tmp;

}int spfa()}}

}return pre[t] != null;

}int min_fee()

ans += d[t] * max_flow;

}return ans;

}void work()

int main()

#undef min

#undef max

再貼乙個求費用流時沒有退流的騙分程式,能過90分。

#include #include #include #include #define min(a, b) ((a) < (b) ? (a) : (b))

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

const char fi = "network.in";

const char fo = "network.out";

const int maxn = 1010;

const int size = 0x3ff;

const int max = 0x3f3f3f3f;

const int min = ~max;

struct edge

;edge *edge[maxn];

int d[maxn];

int cnt[maxn];

int q[size + 1];

int n, m, k, s = 1, t, f, r;

void init_file()

inline int getint()

inline void insert(int u, int v, int f, int c)

edge *p = new edge;

p -> u = u; p -> v = v;

p -> f = f; p -> c = c;

p -> next = edge[u];

edge[u] = p;

p = new edge;

p -> u = v; p -> v = u;

p -> f = 0;

p -> c = max;

p -> next = edge[v];

edge[v] = p;

edge[u] -> back = edge[v];

edge[v] -> back = edge[u];

return;

}void readdata()

return;

}int sap(int u, int lim)

if (d[s] >= n) return tmp;

if ((--cnt[d[u]]) == 0) d[s] = n;

++cnt[++d[u]];

return tmp;

}int spfa()}}

}return d[t];

}void work()

int main()

#undef min

#undef max

網路流 (網路流問題彙總)

網路 1 有乙個源點 s 和匯點 t 2 每一條有向邊e u,v 都有乙個容量限制記做c e 流 定義在網路弧集上的實值函式 f 滿足三個性質 1 對任意的弧 0 f c e 容量限制。2 f u,v f v,u 反對稱性。3 流守恆性 除源匯點外,其餘頂點都是過度點,流進頂點的流總和等於流出頂點的...

網路流 網路流基礎 最大流

學了坤m就對網路流有點感覺了 使網路的流量最大 應用很多,如可以求二分圖的最大匹配 左部左邊來個源點,右部右邊來個匯點 邊權設為1 11最大匹配數就等於網路的最大流量 bfs調整每條邊的流量 很像坤m 增廣路 源點到匯點中剩餘容量為正的一條路徑 找到這條路徑,調整流量 那麼ek演算法的輪廓就出來了 ...

費用流 網路流模版

費用流模版 include include includeusing namespace std const int maxm 100000 最大邊數 const int maxn 1000 最大點數 struct edge edge int a,int b,int c,int d,int e in...