網路流強化 UVA10480

2022-05-13 19:16:31 字數 2645 閱讀 9045

做這道題,自己先是想了好幾種找被割的邊的方法——都被否決了。

後來發現是最小割:只要一條邊的兩端在不同的點集裡面就代表是被割掉的滿流邊(這些滿流邊的流量和等於最大流的流量與最小割的權值和)。

但是之前自己想了乙個例子,

10111

4343

3323

45 10056

1006

710072

1001

810089

1009

10100103

1000

0

首先這個例子我自己誤判了,以為最大流的流量是6,只要割掉1-4和3-2就行——就是腦子短路了,所以我還反過來懷疑雙向邊,再懷疑dfs和bfs尋找割集的方法,最後居然懷疑最大流和最小割的關係。

後來用了別人的**,發現我自己解出來的最大流量值錯了;但是用自己編的資料(在上面的基礎上修改的):

10111

4343

3323

45 356

1006

710072

1001

810089

1009

10100103

1000

0

她居然給我跑出來了三條容量為3的邊,這就是為什麼我懷疑最大流和最小割的關係的原因,後來發現人家在尋找源點能到的點集的時候,不僅要求邊的剩餘流量大於0,還要求基礎的cap容量要大於0,這樣的做法是錯的。修改之後就好了。

ac**:

//

帶解釋的isap

//形式和我的比較相近的 isap

#include#include

#include

using

namespace

std;

#define maxe 2048 //

pay 雙向邊 一共10萬條路 雙向就是20萬 反邊就是40萬

#define maxv 55 //

pay#define maxn 205 //

pay#define sc scanf

#define pt printf

#define rep(i,a,b) for(int i=(a);i

const

int inf = 0x3f3f3f3f

; int cg,sp,ins; //

cg change sp是總流量 ins是加速回溯點

intn,m ,s,t;

intq[maxv],fro,rea;

typedef

struct

eded;

ed e[maxe];

typedef

struct

czcz;

cz ob[maxe];

inttp;

int tot,head[maxv],cur[maxv],vis[maxv],bk[maxv],d[maxv],num[maxv]; //

int mi(int a,int b)

int mx(int a,int b)

void add(int u,int v,int

cap) //

僅有一次的bfs為isap節省了不少時間

bool

bfs()}}

return

vis[s];}//

增廣int

augment()

cg = e[i^1

].v;

}cg =t;

//從匯點到源點更新流量

while (cg !=s)

return

flow;}//

由於每次修改層次的時候,都是在到剩下子節點的距離中挑選最短的加1 所以層次分明不會出現死迴圈

intmax_flow()

advanced = false

;

for (i = cur[u]; i!=-1; i=e[i].nxt)

}if (!advanced)

}if (--num[d[u]] == 0) break; //

gap 優化

++num[d[u] = m+1

];

//我以前一直在想 如果沒有找到怎麼辦呢 現在發現原來找不到的話距離會被賦成n+1

if (u !=s)

u = e[bk[u]^1

].v;}}

return

flow;

}void

init()

intmain()

sp =max_flow();

//pt("%d\n",sp);

memset(vis, 0, sizeof

(vis));

fro = rea = 0

; q[rea] = s; ++rea;

vis[s] = 1

;

intu,v;

while (rea>fro) }}

for(i=0;iif(vis[ob[i].x]+vis[ob[i].y]==1) pt("

%d %d\n

",ob[i].x,ob[i].y);

pt("\n

");}

return0;

}

uva 10480

uva10480最小割集

求最小割集 dinic處理後用dfs對所有點進行標記,遍歷整個聯接邊,起點訪問了,終點沒訪問或者起點沒訪問,終點訪問了就是最小割集之一 include include include include include include include include include include in...

uva10480 最大流最小割定理

題意 求最小割的邊。方法 跑最大流,最後跑完後,s t割,將與源點相連的點分到乙個集合,與匯點相連的點分到另乙個集合。如果邊的兩個點分別在不同的集合中,那麼這個就是最小割上的邊。include include include include include include include using...

網路流強化 HDU4280

陣列沒開夠居然顯示tle而不是re,自己覺得好的優化的方法沒什麼用 帶解釋的 形式和我的比較相近的 include include include using namespace std define maxe 400096 pay 雙向邊 一共10萬條路 雙向就是20萬 反邊就是40萬 defin...