太久沒做網路流的 思維題了,智力急速下降。。。
這個題很妙
主要分析建圖想法摘自
注意,多條邊的交叉情況也是基於這兩種的。發現它具有網路流的性質吧?所以考慮它怎麼和網路流聯絡在一起。把初始點權為1的看做s集合,點權為0的看做t集合。我們其實要做的就是處理完s到t的所有邊,使代價最小。把代價當做割開一條路徑的花費,所求問題即為割最少的邊使得s到t不連通。
主要思想就是 :: 劃分集合 + 隔絕集合
很顯然對於乙個點來說,任意有兩個點權值不同的
顯然就要給這個點賦權來斷開
那麼對於多叉的同理
對於一段連續的無權值的
可以縮成一起
就這樣就解決了
最小割在這裡起到的分離集合的作用
瓶頸是想到將點權不同的點劃分入相應集合,並且在原圖上將其分離
還是比較妙的。。。
#include
#define maxn 7005
typedef
long
long ll;
using
namespace std;
int n,m,h[maxn]
,tot,k,s,t;
ll p[maxn]
,ans,zz;
int dep[maxn]
,vis[maxn]
,cur[maxn]
,gg;
struct nodee[maxn <<1]
, e2[maxn <<1]
;void
add(
int x ,
int y , ll z)
void
init()
}int
bfs()}
if(dep[t]
==0x3f3f3f3f
)return0;
return1;
}ll dfs
(int now , ll low)
ll used = low , res;
for(
int i = h[now]
; i !=(-
1); i = e[i]
.next)
}return low - used;
}void
dinic()
}}void
solve()
for(
int i =
1; i <= m ; i++
) ans =0;
dinic()
; zz +=(
1<< cishu)
* ans;
} cout<}int
main()
SPOJ839 最優標號
給你一張無向圖g v,e 每個頂點都有乙個標號,它是乙個 0,2 31 1 內的整數。不同的頂點可能會有相同的標號。對每條邊 u,v 我們定義其費用cost u,v 為u的標號與v的標號的異或值。現在我們知道一些頂點的標號。你需要確定餘下頂點的標號使得所有邊的費用和盡可能小。輸入檔案的第一行有兩個整...
最優標號(最小割,位運算)
首先分析一下邊權是如何計算的,邊權等於兩點的異或值,由於異或是按位計算,不同位之間是獨立,因此我們可以單獨看一位,只要每一位的答案最小,然後將這些位的答案拼起來,就是最終的答案。每一位的數值非 0 即 1 因此可以劃分成兩個集合。對於已經知道點權的點,如果是 0 就與源點 s 相連,容量是 inft...
AcWing 3205 最優配餐
acwing 3205.最優配餐 棟棟最近開了一家餐飲連鎖店,提供外賣服務。隨著連鎖店越來越多,怎麼合理的給客戶送餐成為了乙個急需解決的問題。棟棟的連鎖店所在的區域可以看成是乙個 n n 的方格圖 如下圖所示 方格的格點上的位置上可能包含棟棟的分店 綠色標註 或者客戶 藍色標註 有一些格點是不能經過...