略。
update:我發現我的最大流一直是寫錯的!!寫錯一年了!!這一年居然沒有被卡真是奇蹟……
void dedge(int sta,int edn,lon w);
fst[sta]=ecnt;
}void edge(int sta,int edn,lon w)
bool bfs()
} return 0;
}lon dfs(int o,lon val)
e[e].w-=out,e[e^1].w+=out;
res-=out;
} return val-res;
}lon dinic()
略。
你有乙個圖,現在邊 \(i\) 的流量必須在 \([l_i,r_i]\),合法的方案是每個點的入流等於其出流,求是否有一種方案?
約定: \(a>b:c\) 代表 \(a\) 向 \(b\) 連一條流量上限為 \(c\) 的有向邊。
首先我們給每個邊流上 \(l_i\),這樣每個邊的範圍就是 \([0,r_i-l_i]\) 了。
但是這樣可能會有一些點入流大於出流(過剩),有一些入流小於出流(不夠)。
過剩的點需要流出,我們便讓它的出邊繼續流。
注:以 loj 模板題樣例 2 為說明物件。
這是每個邊的範圍 \([0,r_i-l_i]\) 中 \((r_i-l_i)\) 的值(不是圖的流量):
比如 2 號點,它的入流是 2,出流是 1。我們要讓它再流出 1 的流量。
但是這是圖的流量:
顯然都是 0,因為根本就沒有人給它流量!
而我們想到,源點和匯點是可以提供 / 吸收流量的。
於是我們就加上乙個虛擬源點 s。連一條邊, \(s>2:1\) ,其中那個 \(1\) 就是其入度與出度的差。
這樣就可以流動了:
如果把一開始減去的 \(l_i\) 加上,就是這樣的了:
2 號點的入流等於出流成立。
所以流程:
使每一條原來的邊 \(a>b\) 變成從 \([l_i,r_i]\) 變成 \([0,r_i-l_i]\),同時 \(a\) 的出流加上 \(l_i\),\(b\) 的入流加上 \(l_i\)。
令 \(x\) 為乙個點入流減去出流的絕對值。讓所有入流大於出流的點(過剩的點),連邊 \(s>i:x\) ;讓出流大於入流的點(不足的點)連邊 \(i>t:x\)。
跑最大流。
如果不等於……突然不想寫了不知道怎麼回事(寫句子寫一半停下來鴿,不愧是我)
網路流學習筆記
先宣告,來自網路,寫得也比較亂,如果有任何問題可以聯絡博主。首先,我們來理解下網路流。在乙個有向圖上選擇乙個源點,乙個匯點,每一條邊上都有乙個流量上限 以下稱為容量 即經過這條邊的流量不能超過這個上界,同時,除源點和匯點外,所有點的入流和出流都相等,而源點只有流出的流,匯點只有匯入的流。這樣的圖叫做...
網路流學習筆記
基本思路 實現 include include include include using namespace std const int maxn 100 const int maxm maxn maxn const int inf 0x3f3f3f3f int head maxn next ma...
網路流學習筆記(2)
最小費用最大流 在保證最大流的前提下,讓費用最小。我們有兩種思路 1.先保證流最大,再去找費用最小的。2.保證費用最小,去找最大流。通常情況下我們會選擇第二種。我們想一下最大流是怎麼做的,bfs分層圖然後dfs每次只找深度 1的去增廣。如果我們要保證最小費用呢?每次去找費用最小的增廣。我們可以spf...