acwing2280 最優標號

2021-10-09 03:05:32 字數 1363 閱讀 1356

太久沒做網路流的 思維題了,智力急速下降。。。

這個題很妙

主要分析建圖想法摘自

注意,多條邊的交叉情況也是基於這兩種的。發現它具有網路流的性質吧?所以考慮它怎麼和網路流聯絡在一起。把初始點權為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 的方格圖 如下圖所示 方格的格點上的位置上可能包含棟棟的分店 綠色標註 或者客戶 藍色標註 有一些格點是不能經過...