2280. 最優標號(最小割,位運算)#困難,想不到

活動 - AcWing

給定一個無向圖?G=(V,E),每個頂點都有一個標號,它是一個?[0,2^31?1] 內的整數。

不同的頂點可能會有相同的標號。

對每條邊?(u,v),我們定義其費用?cost(u,v) 為?u?的標號與?v?的標號的異或值。

現在我們知道一些頂點的標號。

你需要確定余下頂點的標號使得所有邊的費用和盡可能小。

輸入格式

第一行有兩個整數?N,M,N?是圖的點數,M?是圖的邊數。

接下來有?M?行,每行有兩個整數?u,v,代表一條連接?u,v 的邊。

接下來有一個整數?K,代表已知標號的頂點個數。

接下來的?K?行每行有兩個整數?u,p,代表點?u?的標號是?p。

假定這些?u?不會重復。

所有點編號從?1?到?N。

輸出格式

輸出一行一個整數,即最小的費用和。

數據范圍

1≤N≤500,
0≤M≤3000,
1≤K≤N

輸入樣例:
3 2
1 2
2 3
2
1 5
3 100
輸出樣例:
97

?解析:

本題給我們一個無向圖,然后我們給沒有標號的點進行標號,使得所有邊的費用和最小。

每條邊的費用是兩個端點標號的異或和,異或運算是按位運算,因此我們可以每一位單獨看,最終的費用和應該是每一位的和加起來。

由于每一位完全獨立,因此最終費用和的最小值其實就是求每一位的最小值,再合在一起,就是答案。

由于每一位只有 0?和 1?兩種可能,因此所有點可以分成兩類,一類是 0,一類是 1。

然后看一下點與點之間的邊有哪些情況,0?和 0?之間的邊費用就是 0,1?和 1?之間的邊費用就是 0,0?和 1?之間的邊費用就是 1.

由此可以發現,當兩類集合中的點確定之后,整個費用和的最小值就等于兩個集合之間的邊的數量最小值,也就是割。

假設現在要計算第 k?位,若第 k?位中的兩個集合之間的邊的最小數量是 m,也就是有 m?個數第 k?位是 1,一個數第 k?位是 1?的費用是 2^k,那么 m?個的費用就是 m?2^k 因此如果考慮第 k?位,就是要將所有點的第 k?位分成兩類,使得兩類之間的邊的數量最小,這個問題和流網絡中的割非常相似。

我們將原圖的無向邊都在流網絡里建兩條有向邊。然后我們對點集做一個劃分,可以對應到流網絡里割的劃分。原問題中兩個點集之間的邊的權值之和就可以對應到兩個割之間的割的容量。由于割的容量只會算一個方向,所以權值和也只會算一次,因此原問題中對所有點的劃分方式都可以對應到割的劃分方式,因此最小費用和就等于最小割(將中間的邊的容量設為 1)。

求最小割還需要一個源點和匯點,我們可以建立虛擬源點和虛擬匯點。

有些點最開始是有編號的,如果有些點的標號是 0,說明他一定要和源點在一個集合,那么我們就從源點向這些點連一條容量是 +∞?的邊,這樣這些點就一定能從源點走到,這些點就必然不會和匯點在同一個集合,否則源點和匯點就在同一個集合,就矛盾了。如果有些點的標號是 1,說明這些點就必須和匯點在一個集合,同理從這些點向匯點連一條容量是 +∞?的邊。

至于剩下的沒有標號的點,有可能和源點一個集合也有可能和匯點一個集合,我們就不做多余的操作了,求最小割的時候按照最優情況分配即可。

綜上所述,我們只需要對于每一位分別去求一下最小割,那么每一位的費用就一定是最小的,把每一位的費用加到一塊就是總費用的最小值。

本題并沒有要求合法方案,這里也可以說明一下,對于每一位,能從源點走到的點都一定和源點在一個集合,能走到匯點的點都一定和匯點在一個集合,通過搜索就能將所有點分成兩類,和源點一類的點這一位都選 0,和匯點一類的點這一位都選 1,這樣就能確定每個點每一位的值,得出整個的方案。

注意,本題是無向圖,無向邊我們就建兩條有向邊即可,但是在殘量網絡中每條邊有一個反向邊,一條無向邊會變成四條邊,這里和前面一樣采用合并的方式合成兩條邊。

作者:小小_88
鏈接:https://www.acwing.com/solution/content/128199/
來源:AcWing
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

此作者的題解都寫得非常好,因此我就直接引用此題解。

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<math.h>
#include<map>
#include<sstream>
#include<deque>
#include<unordered_map>
#include<unordered_set>
#include<bitset>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
const int N = 5e2 + 5, M = (3e3 + N)*2 + 10, INF = 0x3f3f3f3f;
int n, m, K, S, T;
int h[N], e[M], f[M], ne[M], idx;
int q[N], d[N], cur[N];
int p[N];
struct edge{int a, b;
}edges[M];void add(int a, int b, int c1, int c2) {e[idx] = b, f[idx] = c1, ne[idx] = h[a], h[a] = idx++;e[idx] = a, f[idx] = c2, ne[idx] = h[b], h[b] = idx++;
}void build(int x) {memset(h, -1, sizeof h);idx = 0;for (int i = 1; i <= m; i++) {add(edges[i].a, edges[i].b, 1, 1);}for (int i = 1; i <= n; i++) {if (p[i] >= 0) {if (p[i] >> x & 1)add(i, T, INF, 0);else add(S, i, INF, 0);}}
}bool bfs() {int hh = 0, tt = 0;memset(d, -1, sizeof d);q[0] = S, d[S] = 0, cur[S] = h[S];while (hh <= tt) {int t = q[hh++];for (int i = h[t]; i != -1; i = ne[i]) {int j = e[i];if (d[j] == -1 && f[i]) {d[j] = d[t] + 1;cur[j] = h[j];if (j == T)return 1;q[++tt] = j;}}}return 0;
}int find(int u, int limit) {if (u == T)return limit;int flow = 0;for (int i = cur[u]; i != -1 && flow < limit; i = ne[i]) {int j = e[i];cur[u] = i;if (d[j] == d[u] + 1 && f[i]) {int t = find(j, min(f[i], limit - flow));if (!t)d[j] = -1;f[i] -= t, f[i ^ 1] += t, flow += t;}}return flow;
}LL dinic(int x) {build(x);LL ret = 0, flow;while (bfs())while (flow = find(S, INF)) {ret += flow;}return ret;
}int main() {scanf("%d%d", &n, &m);S = 0, T = n + 1;for (int i = 1, a, b; i <= m; i++) {scanf("%d%d", &edges[i].a, &edges[i].b);}cin >> K;memset(p, -1, sizeof p);for (int i = 1,a,b; i <= K; i++) {scanf("%d%d", &a, &b);p[a] = b;}LL ret = 0;for (int i = 0; i <= 30; i++) ret += dinic(i) << i;cout << ret << endl;return 0;
}

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/712783.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/712783.shtml
英文地址,請注明出處:http://en.pswp.cn/news/712783.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

七通道NPN 達林頓管GC2003,專為符合標準 TTL 而制造,最高工作電壓 50V,耐壓 80V

GC2003 內部集成了 7 個 NPN 達林頓晶體管&#xff0c;連接的陣列&#xff0c;非常適合邏輯接口電平數字電路&#xff08;例 如 TTL&#xff0c;CMOS 或PMOS 上/NMOS&#xff09;和較高的電流/電壓&#xff0c;如電燈電磁閥&#xff0c;繼電器&#xff0c;打印機或其他類似的負…

讀《代碼整潔之道》有感

最近讀了一本書&#xff0c;名字大家都看到了&#xff1a;《代碼整潔之道》&#xff0c;之前一直只是聽說過這本書的大名&#xff0c;卻一直沒有進行拜讀&#xff0c;最近想起來了就想著看一看&#xff0c;不看不要緊&#xff0c;看了之后就像吃了炫邁&#xff0c;根本停不下來…

MATLAB環境下腦電信號EEG的譜分析

腦電信號一直伴隨著人類的生命&#xff0c;腦電波是腦神經細胞發生新陳代謝、離子交換時細胞群興奮突觸電位總和&#xff0c;腦電信號的節律性則和丘腦相關&#xff0c;含有豐富的大腦活動信息。通常我們所接觸的腦電圖都是頭皮腦電圖&#xff0c;在有些特殊場合還需要皮下部位…

10.廣域網技術

1. PPP實驗點這里&#xff08;拓撲代碼&#xff09; 2. PPPoE配置實驗點這里&#xff08;拓撲代碼&#xff09; 目錄 一、廣域網二、PPP協議三、PPP鏈路建立過程1-LCP&#xff08;鏈路協商&#xff09;四、PPP鏈路建立過程2-PAP/CHAP&#xff08;認證協商&#xff0c;可選&…

linux系統多個mysql時的部署和服務注冊

在一次實際部署過程中,碰到了服務器已經部署了一個mysql服務. 再部署新的mysql時,特別注意不能與另一個mysql互相影響.記錄一次部署中存在的問題和解決方法. 因為已存在mysql,新的mysql部署采用的是mysql.tar.gz解壓手動安裝,避免.rpm或者.deb等自動安裝方式覆蓋了已有mysql的配…

python語言1

一、pytho中的注釋 1.1注釋的理解 程序員在代碼中對代碼功能解釋說明的標注性文字可以提高代碼的可讀性注釋的內容將被python解釋器忽略&#xff0c;不被計算機執行 1.2注釋的分類 注釋分為&#xff1a;單行注釋、多行注釋、中文聲明注釋 &#xff08;1&#xff09;單行注…

LeetCode240題:搜索二維矩陣II(python3)

代碼思路&#xff1a; “根節點” 對應的是矩陣的 “左下角” 和 “右上角” 元素&#xff0c;以 matrix 中的左下角元素為標志數 flag &#xff0c;則有: 若 flag > target &#xff0c;則 target 一定在 flag 所在行的上方 &#xff0c;即 flag 所在行可被消去&#xff0c…

kotlin安卓開發教程視頻,2024年Android開發陷入飽和

Android基礎 1、什么是ANR 如何避免它&#xff1f; 如果耗時操作需要讓用戶等待&#xff0c;那么可以在界面上顯示進度條。 2、View的繪制流程&#xff1b;自定義View如何考慮機型適配&#xff1b;自定義View的事件 3、分發機制&#xff1b;View和ViewGroup分別有哪些事件分…

Java協議解析:探索網絡編程的核心

引言 在當今數字化時代&#xff0c;網絡編程扮演著日益重要的角色&#xff0c;而Java協議則成為這個領域中不可或缺的一部分。隨著互聯網的普及和各種網絡應用的不斷涌現&#xff0c;對網絡通信的要求也變得越來越嚴格&#xff0c;這就需要對Java協議進行深入的理解和探索。本…

【知識管理】計算全局效率 Network global efficiency

這句話提到的“全局效率”&#xff08;global efficiency&#xff09;是網絡中信息傳遞效率的一個衡量指標&#xff0c;它是網絡中最短路徑長度的倒數的平均值。為了更好地理解這個概念&#xff0c;讓我們分解這個定義&#xff1a; 最短路徑長度&#xff08;Shortest Path Len…

輸出數據庫全部表的外鍵引用拓撲結構

執行 sql&#xff1a; SELECTconstraint_name,table_name,column_name,referenced_table_name,referenced_column_name FROMinformation_schema.key_column_usage WHEREtable_schema ${databaseName} ANDreferenced_table_name IS NOT NULL 將執行結果復制到臨時文件中&#…

【Leetcode每日一刷】貪心算法|122.買賣股票的最佳時機 II、55. 跳躍游戲

一、122.買賣股票的最佳時機 II 力扣題目鏈接 &#x1f984;解題思路&#xff1a; 首先需要明確的幾個點&#xff1a; 當前只能有最大一支股票每一天操作只能3選1&#xff1a;買or賣or休息 此外&#xff0c;對于貪心&#xff0c;總有像下面圖示的一種直覺&#xff1a;如果…

力扣SQL50 產品銷售分析 I 查詢

Problem: 1068. 產品銷售分析 I 思路 left join on&#xff1a;左連接 Code select p.product_name, s.year, s.price from Sales s left join Product p on s.product_id p.product_id

靠譜的車【華為OD機試-JAVAPythonC++JS】

題目描述 程序員小明打了一輛出租車去上班。出于職業敏感&#xff0c;他注意到這輛出租車的計費表有點問題&#xff0c;總是偏大。 出租車司機解釋說他不喜歡數字4&#xff0c;所以改裝了計費表&#xff0c;任何數字位置遇到數字4就直接跳過&#xff0c;其余功能都正常。 比如&…

Scaffold 腳手架

Scaffold 腳手架 Scaffold 腳手架組件是一個核心組件&#xff0c;它為開發者提供了一個標準的、可定制的應用界面框架。androidx.compose.material3.Scaffold 包含了應用界面的基礎元素&#xff0c;如狀態欄、導航欄、頂部應用欄&#xff08;TopAppBar&#xff09;等。通過 Sc…

Windows的Docker-Desktop安裝與問題總結

目錄 Docker-Desktop安裝步驟 環境配置 Docker-Desktop安裝問題總結 問題1&#xff1a;docker-desktop setting界面一直加載轉圈 問題2&#xff1a;docker鏡像的存儲位置變更&#xff08;防止C盤空間不足&#xff09; 參考文獻&#xff1a; Docker-Desktop安裝步驟 環境…

又挖到寶了!國人團隊研發的AI視頻工具PixVerse,這么好用居然還完全免費!(強烈推薦)

昨天發了一款國產免費的 AI 繪畫工具 Dreamina 的介紹&#xff1a; 居然才發現&#xff01;字節跳動旗下國產AI繪畫工具Dreamina&#xff0c;這么好用居然還免費&#xff01;&#xff08;強烈推薦&#xff09; 發現大家對國產 AI 工具還挺感興趣的。今天繼續幫大家挖國產的 A…

【Leetcode每日一題】二分查找 - 山脈數組的峰頂索引(難度??)(23)

1. 題目解析 Leetcode鏈接&#xff1a;852. 山脈數組的峰頂索引 這個問題的理解其實相當簡單&#xff0c;只需看一下示例&#xff0c;基本就能明白其含義了。 核心在于找到題目中所說的峰值所在的下標并返回他們的下標即可。 2. 算法原理 峰頂及兩側數據特點分析 峰頂數據…

運算放大電路常用接法

1、反相比例運算電路 2、同相比例運算電路 3、電壓跟隨器 4、反相求和運算電路 5、同相求和運算電路 6、加減運算電路 7、加減電路 8、積分運算電路 9、實用積分電路 10、微分運算電路 11、實用微分電路 12、壓控電壓源二階低通濾波器 13、壓控電壓源二階高通濾波器 14、RC橋式…

[剪藏] - 尊湃通訊公司竊密曝光,發現繞不過華為

在科技領域風起云涌的今天&#xff0c;一場驚心動魄的竊密事件悄然發生&#xff0c;涉及華為WIFI6芯片技術的商業秘密被竊取&#xff0c;案中主謀竟然是一位曾在華為海思擁有重量級地位的技術大佬。本文將深入挖掘這起事件的來龍去脈&#xff0c;探討竊密者的背叛和華為的技術守…