最優標號(最小割,位運算)

2022-06-08 14:33:10 字數 1173 閱讀 1868

首先分析一下邊權是如何計算的,邊權等於兩點的異或值,由於異或是按位計算,不同位之間是獨立,因此我們可以單獨看一位,只要每一位的答案最小,然後將這些位的答案拼起來,就是最終的答案。

每一位的數值非\(0\)即\(1\),因此可以劃分成兩個集合。對於已經知道點權的點,如果是\(0\),就與源點\(s\)相連,容量是\(\infty\);如果是\(1\),就與匯點\(t\)相連,容量是\(\infty\)

其他的點有可能屬於\(0\)集合,也可能屬於\(1\)集合,因此最小割即為答案。

#include #include #include #include #include #define x first

#define y second

using namespace std;

typedef long long ll;

typedef pairpii;

const int n = 510, m = 8010, inf = 1e8;

int n, m, s, t, k;

int h[n], e[m], ne[m], f[m], idx;

int cur[n], d[n], p[n];

pii edge[m];

void add(int a, int b, int c1, int c2)

void build(int k)

}for(int i = 0; i < m; i ++)

}bool bfs()}}

return false;

}int find(int u, int limit)

}return flow;

}ll dinic(int k)

}return res;

}int main()

; }

scanf("%d", &k);

for(int i = 0; i < k; i ++)

ll res = 0;

for(int i = 0; i < 31; i ++) res += dinic(i) << i;

printf("%lld\n", res);

return 0;

}

《最小割模型在資訊學競賽中的應用》最優標號

題意 定義兩點邊權值等於點權異或值,給出一些點權值,求如何給其他點標號使所有邊權之和最小。題解 根據異或的性質,我們可以單獨確定每乙個二進位制位的最小值。對於每一位來講 考慮這一位如果為1與源點連邊,否則與匯點連邊。那麼與源點相連的點集集合內貢獻為0,與匯點相連的點集集合內貢獻為0,對答案貢獻的只有...

BZOJ 3774 最優選擇 最小割

驚了我竟然排rank 2,鹹魚有朝一日也能翻身。1a 先留個坑 include include include using namespace std const int n 5005,m n 10,inf 0x3f3f3f3f namespace graph bool bfs return lev...

BZOJ 3774 最優選擇 最小割

此題與 文理分科 那道題目有些類似。都是使用最小割來求解,先加上可能獲得的權值,在減掉必須捨棄的權值 最小割 文理分科是規定每個人和 s 連就是選文,和 t 連就是選理。然後如果乙個人和相鄰的人都全文就會獲得乙個權值,那麼我們就為這個權值建乙個點,讓這個點與必須同時選文的5個人連 inf 邊。這樣只...