UVA11248 網路擴容(列舉割邊擴充)

2021-06-26 09:38:29 字數 2267 閱讀 6520

題意:

給你乙個有向圖,問你從1到n的最大流是多少?如果流量大於等於c那麼直接輸出乙個串,否則輸出只擴充一條邊的流量就可以達到1->n大於等於c的所有邊,如果擴充不了就

輸出另乙個串。

sample input                            

4 4 5

1 2 5

1 3 5

2 4 5

3 4 5

4 4 5

1 2 1

1 3 5

2 4 5

3 4 1

4 4 5

1 2 1

1 3 1

2 4 1

3 4 1

0 0 0

output for sample input

case 1: possible

case 2: possible option:(1,2),(3,4)

case 3: not possible

思路:很容易想到的一點就是擴充套件後有作用的點肯定是割邊,那麼我們可以先跑一遍最大流把割邊找出來,然後列舉割邊,擴充割邊流量,看最大流是否大於等於c,但是這樣會tle,有兩個比較有用的優化,就是每次都在殘餘網路上改流量,然後加上殘餘網路之前跑出來的流量,還有乙個優化就是跑最大流的時候,如果當前流量大於等於c了就已經滿足了,沒必要再跑了。

#include

#include

#include

#include

#define n_node 100 + 5

#define n_edge 20000 + 10

#define inf 2005000000

using namespace std;

typedef struct

star;

typedef struct

dep;

typedef struct

edge;

star e[n_edge] ,mke[n_edge];

edge edge[n_edge] ,ans_edge[n_edge];

dep xin ,tou;

int list[n_node] ,list2[n_node] ,mklist[n_node] ,tot;

int deep[n_node];

void add(int a ,int b ,long long c)

bool camp(edge a ,edge b)

long long minn(long long a ,long long b)

bool bfs_deep(int s ,int t ,int n)

}for(int i = 0 ;i <= n ;i ++)

list2[i] = list[i];

return deep[t] != -1;

}long long dfs_flow(int s ,int t ,long long flow ,long long c)

if(!nowflow) deep[s] = 0;

return nowflow;

}long long dinic(int s ,int t ,int n ,long long c)

return ans;

}int main ()

long long ans = dinic(1 ,n ,n ,c);

printf("case %d: " ,cas ++);

if(ans >= c) 

int nowid = 0;

for(i = 2 ;i <= tot ;i += 2)

}for(i = 1 ;i <= n ;i ++)

mklist[i] = list[i];

int ans_id = 0;

int mktot = tot;

for(i = 1 ;i <= nowid ;i ++)

if(!ans_id)

sort(ans_edge + 1 ,ans_edge + ans_id + 1 ,camp);

printf("possible option:");

for(i = 1 ;i <= ans_id ;i ++)

if(i != 1) printf(",(%d,%d)" ,ans_edge[i].a ,ans_edge[i].b);

else  printf("(%d,%d)" ,ans_edge[i].a ,ans_edge[i].b);

puts("");

}return 0;

}

ZJOI2010 網路擴容

題目描述 給定一張有向圖,每條邊都有乙個容量c和乙個擴容費用w。這裡擴容費用是指將容量擴大1所需的費用。求 1 在不擴容的情況下,1到n的最大流 2 將1到n的最大流增加k所需的最小擴容費用。輸入格式 輸入檔案的第一行包含三個整數n,m,k,表示有向圖的點數 邊數以及所需要增加的流量。接下來的m行每...

ZJOI2010 網路擴容

最大流 費用流 洛谷位址 第一問就直接跑最大流。第二問目前有兩種方法 include include include include using namespace std define inf 0x7fffffff int n,m,k,s,t struct edgee 100005 int fir...

bzoj1834 網路擴容

給定一張有向圖,每條邊都有乙個容量c和乙個擴容費用w。這裡擴容費用是指將容量擴大1所需的費用。求 1 在不擴容的情況下,1到n的最大流 2 將1到n的最大流增加k所需的最小擴容費用。輸入檔案的第一行包含三個整數n,m,k,表示有向圖的點數 邊數以及所需要增加的流量。接下來的m行每行包含四個整數u,v...