做這道題,自己先是想了好幾種找被割的邊的方法——都被否決了。
後來發現是最小割:只要一條邊的兩端在不同的點集裡面就代表是被割掉的滿流邊(這些滿流邊的流量和等於最大流的流量與最小割的權值和)。
但是之前自己想了乙個例子,
10111首先這個例子我自己誤判了,以為最大流的流量是6,只要割掉1-4和3-2就行——就是腦子短路了,所以我還反過來懷疑雙向邊,再懷疑dfs和bfs尋找割集的方法,最後居然懷疑最大流和最小割的關係。4343
3323
45 10056
1006
710072
1001
810089
1009
10100103
1000
0
後來用了別人的**,發現我自己解出來的最大流量值錯了;但是用自己編的資料(在上面的基礎上修改的):
10111她居然給我跑出來了三條容量為3的邊,這就是為什麼我懷疑最大流和最小割的關係的原因,後來發現人家在尋找源點能到的點集的時候,不僅要求邊的剩餘流量大於0,還要求基礎的cap容量要大於0,這樣的做法是錯的。修改之後就好了。4343
3323
45 356
1006
710072
1001
810089
1009
10100103
1000
0
ac**:
//uva 10480帶解釋的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;
}
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...