381. 有線電視網絡(網絡流,最小割,《算法競賽進階指南》)

381. 有線電視網絡 - AcWing題庫

給定一張?n?個點?m?條邊的無向圖,求最少去掉多少個點,可以使圖不連通。

如果不管去掉多少個點,都無法使原圖不連通,則直接返回?n。

輸入格式

輸入包含多組測試數據。

每組數據占一行,首先包含兩個整數?n?和?m,接下來包含?m?對形如?(x,y) 的數對,形容點?x?與點?y?之間有一條邊。

數對?(x,y) 中間不會包含空格,其余地方用一個空格隔開。

輸出格式

每組數據輸出一個結果,每個結果占一行。

數據范圍

0≤n≤50

輸入樣例:
0 0
1 0
3 3 (0,1) (0,2) (1,2)
2 0
5 7 (0,1) (0,2) (1,3) (1,2) (1,4) (2,3) (3,4)
輸出樣例:
0
1
3
0
2

解析:?

通過刪除某些點讓無向圖不連通。

如果是刪除某些邊使得無向圖不連通,我們很容易想到使用最小割算法將割邊刪去。通過枚舉源點 S 和匯點 T,然后使用最小割算法處理。

但本題要求將點刪除,而非將邊刪除。我們需要將點轉換成邊看看是否能使用最小割算法。

拆點:

使用常見的拆點方式,將點拆成出點和入點,且出點和入點之間連一條邊,邊權為1,對應本題中要求求得點得數量。

簡單割處理:??

由于本題只能刪除點而不能刪除邊,所以我們要使得最小割算法不刪除原圖得邊:將原圖的邊的容量設為正無窮。(最小割算法中的常用技巧,將不希望作為割邊的邊的容量設為正無窮)?

定義簡單割:割邊僅為有限容量的邊形成的割稱為簡單割

?簡單割具體證明參考:2325. 有向圖破壞(二分圖,最小點權覆蓋,最小割,網絡流)-CSDN博客?

證明簡單割與要刪掉的點的點割集存在一一對應的關系:

簡單割=>?點割集
因為我們通過簡單割求出的割邊都是點內部的邊,當我們把簡單割里的邊全刪掉后,源點和匯點則不會聯通了,這些構成“內部邊”的點的集合就是點割集。

下面用反證法證明上面構造出來的點割集一定是符合題意的要刪掉的點:

假設上面構造出來的點割集不符合題意,即把上面所有的點刪掉,在原圖里依然存在從源點到達匯點的路徑,說明在原圖中,存在一條不經過我們構造出來的點割集里的點的路徑即不經過“點內部的邊”,依然能從源點到達匯點,對應到流網絡里則是存在一條從源點到匯點的不經過割邊的路徑,則說明源點與匯點在一個集合里,說明這不是一個割,與前提矛盾。因此反證得證。

點割集=>?簡單割
這里的點割集指的是“極小點割集”

構造簡單割的方法:

從源點開始dfs一遍,若經過點割集里的點,則停下不往前搜,若不是則往前搜,每次把搜到的點打個標記,這樣標記了的點就是S集合,沒有標記的點就是T集合,構成一個簡單割C[S,T]因此我們可以證出簡單割與割點集存在一一對應的關系。

考慮數量關系
由于我們建邊的時候把入點到出點的邊的容量設為1,則得到的簡單割的割邊和就是選到的點的數量,則可以得到:割點集的點的數量 = 簡單割的割的容量和 ,因此:最小割點集 = 最小割

#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 = 1e2 + 10, M = (2500+50) * 2 + 10, INF = 0x3f3f3f3f;
int n, m, S, T;
int h[N], e[M], f[M], ne[M], idx;
int q[N], d[N], cur[N];void add(int a, int b, int c) {e[idx] = b, f[idx] = c, ne[idx] = h[a], h[a] = idx++;e[idx] = a, f[idx] = 0, ne[idx] = h[b], h[b] = idx++;
}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;
}int dinic() {int ret = 0, flow;while (bfs())while (flow = find(S, INF))ret += flow;return ret;
}int main() {while (cin >> n >> m) {memset(h, -1, sizeof h);idx = 0;for (int i = 0; i < n; i++) {add(i, i + n, 1);}for (int i = 1,a,b; i <= m; i++) {scanf(" (%d,%d)", &a, &b);add(n + a, b, INF);add(n + b, a, INF);}int ans = n;for (int i = 0; i < n; i++) {for (int j = 0; j < i; j++) {S = n + i, T = j;for (int k = 0; k < idx; k += 2) {f[k] += f[k ^ 1];f[k ^ 1] = 0;}ans = min(ans, dinic());}}cout << ans << endl;}return 0;
}

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

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

相關文章

Python推導式大全與實戰:精通列表、字典、集合和生成器推導式【第115篇—python:推導式】

Python推導式大全與實戰&#xff1a;精通列表、字典、集合和生成器推導式 Python語言以其簡潔、優雅的語法而聞名&#xff0c;其中推導式是其獨特之處之一。推導式是一種在一行代碼中構建數據結構的強大方式&#xff0c;它涵蓋了列表、字典、集合和生成器。本篇博客將全面介紹…

YOLOv8實例分割實戰:ONNX模型轉換及TensorRT部署

課程鏈接&#xff1a;https://edu.csdn.net/course/detail/39320 PyTorch版的YOLOv8支持高性能的實時實例分割。 TensorRT是針對英偉達GPU的加速工具。 ONNX &#xff08;Open Neural Network Exchange&#xff09; 作為一個開放的網絡模型中間表示&#xff08;IR&#xff0…

Redis命令大全

通用命令 KEYS pattern&#xff1a;查找所有符合給定模式&#xff08;pattern&#xff09;的 key。EXISTS key&#xff1a;檢查指定 key 是否存在。TYPE key&#xff1a;返回指定 key 的數據類型。DEL key [key …]&#xff1a;刪除指定的 key。RENAME key newkey&#xff1a;…

spring boot 修復 Spring Framework URL解析不當漏洞(CVE-2024-22243)

漏洞描述 當應用程序使用UriComponentsBuilder來解析外部提供的URL&#xff08;如通過查詢參數&#xff09;并對解析的URL的主機執行驗證檢查時可能容易受到Open重定向攻擊和SSRF攻擊&#xff0c;導致網絡釣魚和內部網絡探測等。 受影響產品或系統 6.1.0 < Spring Framew…

Vue項目的快速搭建

Vue項目的快速搭建 一、下載并安裝node.js二、安裝Vue腳手架三、創建vue項目四、項目啟動五、VS Code下載安裝 一、下載并安裝node.js 首先確保已經安裝了Node.js。如果沒有安裝&#xff0c;可以去官網&#xff08;https://nodejs.org/&#xff09;下載并安裝最新版本的Node.j…

基于STC12C5A60S2系列1T 8051單片機的TM1638鍵盤數碼管模塊的數碼管顯示應用

基于STC12C5A60S2系列1T 8051單片機的TM1638鍵盤數碼管模塊的數碼管顯示應用 STC12C5A60S2系列1T 8051單片機管腳圖STC12C5A60S2系列1T 8051單片機I/O口各種不同工作模式及配置STC12C5A60S2系列1T 8051單片機I/O口各種不同工作模式介紹TM1638鍵盤數碼管模塊概述TM1638鍵盤數碼管…

mybatis-傳遞參數的方式

mybatis 傳遞參數的7種方法 在實際開發過程中&#xff0c;增刪改查操作都要涉及到請求參數的傳遞&#xff0c;今天這節就集中講下在mybatis中傳遞參數的7中方法 單個參數的傳遞很簡單沒有什么好將的&#xff0c;這里主要說下多個參數的傳遞 1、第一種方式 匿名參數 順序傳遞…

[electron]窗口 BrowserWindow

優雅的顯示窗口 const {app, BrowserWindow} require(electron);function createMainwindow(){const mainwindow new BrowserWindow({x: 300,y: 400,width: 600,height: 600,});mainwindow.loadFile(index.html); }app.on(ready, ()>{createMainwindow(); });對于這樣的代…

前端發起請求,后端模型需處理很久,怎樣設置前端直接完成請求響應,后端計算完在返回結果給前端?

在這種情況下&#xff0c;可以采用異步處理的方式來解決。具體步驟如下&#xff1a; 前端發起請求&#xff1a;前端向后端發送請求&#xff0c;但是不等待后端處理完成而是立即得到響應。 后端異步處理&#xff1a;后端接收到請求后&#xff0c;不立即進行處理&#xff0c;而是…

Codeforces Round 886 (Div. 4)----->E. Cardboard for Pictures

一&#xff0c;思路&#xff1a; 這題我們可以通過二分 w來直接得到答案&#xff0c;時間復雜度是nlogn的級別&#xff0c;但是這里有個很坑的地方&#xff0c;就是假如你用二分做&#xff0c;會面臨報 long long 的問題&#xff0c;但是問題不大&#xff0c;直接用 unsigned …

題目:金三銀四求職季:如何脫穎而出

題目&#xff1a;金三銀四求職季&#xff1a;如何脫穎而出 引言&#xff1a; 隨著春天的腳步漸近&#xff0c;對于許多程序員來說&#xff0c;一年中最繁忙、最重要的面試季節也隨之而來。金三銀四&#xff0c;即三月和四月&#xff0c;被廣大程序員視為求職的黃金時期。在這兩…

藍橋杯倒計時 41天 - KMP 算法

KMP算法 KMP算法是一種字符串匹配算法&#xff0c;用于匹配模式串P在文本串S中出現的所有位置。 例如S“ababac&#xff0c;P“aba”&#xff0c;那么出現的所有位置是13。 在初學KMP時&#xff0c;我們只需要記住和學會使用模板即可&#xff0c;對其原理只需簡單理解&#xff…

用Socks5代理游戲,繞過“網絡海關”去探險

1. 出海大冒險的開始 在游戲世界&#xff0c;就像在現實生活中一樣&#xff0c;有時我們需要越過海洋去探索未知的世界。但是&#xff0c;網絡上也有一些“海關”&#xff0c;限制我們訪問某些網站或游戲服務器。這就是我們今天要克服的挑戰&#xff01; 2. Socks5代理&#xf…

Django 官網項目 四

內容&#xff1a; 利用HTTP的post方法&#xff0c;更改數據并顯示。 創建detail.html文件&#xff0c;來創建POST內容 修改應用的視圖文件views.py&#xff0c;vote方法 修改應用的視圖文件views.py&#xff0c;results方法。 創建results.html文件。 結果&#xff1a;單…

.NET開源功能強大的串口調試工具

前言 今天大姚給大家分享一款.NET開源的、功能強大的串口調試工具&#xff1a;LLCOM。 工具介紹 LLCOM是一個.NET開源的、功能強大的串口調試工具。支持Lua自動化處理、串口調試、串口監聽、串口曲線、TCP測試、MQTT測試、編碼轉換、亂碼恢復等功能。 功能列表 收發日志清晰…

將SpringBoot項目改造成solon項目

solon項目介紹 官網 Java “生態型”應用開發框架&#xff1a;更快、更小、更簡單。 啟動快 5 &#xff5e; 10 倍&#xff1b;并發高 2&#xff5e; 3 倍&#xff1b; 內存省 1/3 ~ 1/2&#xff1b;打包縮到 1/2 ~ 1/10&#xff1b;同時支持 java8, java11, java17, java21&a…

數據結構學習(二)字符串

字符串 1. 概念 字符串就是特殊的字符數組&#xff0c;字符數組末尾的元素為 ‘\0’。和數組一樣可以使用arr[i]或*(arri)來訪問元素。 無論是用數組保存字符串&#xff08;如&#xff1a;char arr[] "Hello&#xff0c;World";&#xff09;&#xff0c;還是用指針…

漢諾塔問題(c++題解)

題目描述 1、一次只許移動一個盤 2、任何時候、任何柱子不允許把大盤放在小盤上面。 3、可使用任一一根立柱暫存圓盤。 問&#xff1a;如何使用最少步數實現n個盤子的移動&#xff1f;打印出具體移動方案。 輸入格式 一行一個數n, 1< n < 18 輸出格式 輸出若干行…

關于HTML5表單驗證的方法教程

簡介 HTML5表單驗證是一種在客戶端對用戶輸入進行驗證的方法&#xff0c;可以有效地減少對于服務器端驗證的依賴。通過使用HTML5表單驗證&#xff0c;可以為用戶提供實時的錯誤提示和更好的用戶體驗。本教程將介紹如何在HTML5中使用各種驗證屬性和技術來實現表單驗證。 基本表…

flynn發布服務小結

背景 flynn是一個基于容器的paas平臺&#xff0c;可以快速的發布運行新的應用&#xff0c;用戶只需要提交代碼到git上&#xff0c;flynn就會基于提交的代碼進行發布和部署&#xff0c;本文就簡單看下flynn發布部署的流程 flynn發布服務 1.首先flynn會基于用戶的web代碼構建一…