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