[luoguP2774] 方格取數問題(最大點權獨立集)

傳送門

?

引入兩個概念:

最小點權覆蓋集:滿足每一條邊的兩個端點至少選一個的最小權點集。

最大點權獨立集:滿足每一條邊的兩個端點最多選一個的最大權點集。

現在對網格染色,使得相鄰兩點顏色不同,之后把兩個顏色的點分成兩個集合X,Y。S向X集合每個點連一條該點權值的邊,Y集合每個點向T連一條該點權值的邊,原來的邊流量全部變為INF。這個網絡的最小割為最小點權覆蓋集。因為這個最小割滿足了,對于中間每一條邊,兩端的點必定選擇了一個。若一個都沒有選擇則S與T仍連通。且因為中間的邊流量為INF所以不會是中間被堵塞。

然后我們可以證明對于每一個點權覆蓋集,將選的點不選,不選的點選,得到的點集一定是一個點權獨立集。因為每一條邊至少選了一個,反選后就至少有一個選不了。

所以該網絡的最小割=最大流=權值和-答案

答案就是權值和-最大流,跑一遍最大流即可

?

——代碼

  1 #include <queue>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <iostream>
  5 #define INF 1e9
  6 #define N 10010
  7 #define M 50001
  8 #define min(x, y) ((x) < (y) ? (x) : (y))
  9 
 10 int n, m, cnt, sum, s, t, num;
 11 int head[N], to[M], val[M], next[M], dis[N], cur[N];
 12 int map[101][101], dx[4] = {0, 1, -1, 0}, dy[4] = {1, 0, 0, -1};
 13 
 14 inline int read()
 15 {
 16     int x = 0, f = 1;
 17     char ch = getchar();
 18     for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -1;
 19     for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - '0';
 20     return x * f;
 21 }
 22 
 23 inline void add(int x, int y, int z)
 24 {
 25     to[cnt] = y;
 26     val[cnt] = z;
 27     next[cnt] = head[x];
 28     head[x] = cnt++;
 29 }
 30 
 31 inline bool bfs()
 32 {
 33     int i, u, v;
 34     std::queue <int> q;
 35     memset(dis, -1, sizeof(dis));
 36     q.push(s);
 37     dis[s] = 0;
 38     while(!q.empty())
 39     {
 40         u = q.front(), q.pop();
 41         for(i = head[u]; i ^ -1; i = next[i])
 42         {
 43             v = to[i];
 44             if(val[i] && dis[v] == -1)
 45             {
 46                 dis[v] = dis[u] + 1;
 47                 if(v == t) return 1;
 48                 q.push(v);
 49             }
 50         }
 51     }
 52     return 0;
 53 }
 54 
 55 inline int dfs(int u, int maxflow)
 56 {
 57     if(u == t) return maxflow;
 58     int v, d, ret = 0;
 59     for(int &i = cur[u]; i ^ -1; i = next[i])
 60     {
 61         v = to[i];
 62         if(val[i] && dis[v] == dis[u] + 1)
 63         {
 64             d = dfs(v, min(val[i], maxflow - ret));
 65             ret += d;
 66             val[i] -= d;
 67             val[i ^ 1] += d;
 68             if(ret == maxflow) return ret;
 69         }
 70     }
 71     if(ret ^ maxflow) dis[u] = -1;
 72     return ret;
 73 }
 74 
 75 int main()
 76 {
 77     int i, j, k, x, y;
 78     m = read();
 79     n = read();
 80     s = 0, t = n * m + 1;
 81     memset(head, -1, sizeof(head));
 82     for(i = 1; i <= m; i++)
 83         for(j = 1; j <= n; j++)
 84         {
 85             num++;
 86             sum += x = read();
 87             if((i + j) & 1)
 88             {
 89                 add(s, num, x), add(num, s, 0);
 90                 if(i > 1) add(num, num - n, INF), add(num - n, num, 0);
 91                 if(i < m) add(num, num + n, INF), add(num + n, num, 0);
 92                 if(j > 1) add(num, num - 1, INF), add(num - 1, num, 0);
 93                 if(j < n) add(num, num + 1, INF), add(num + 1, num, 0);
 94             }
 95             else add(num, t, x), add(t, num, 0);
 96         }
 97     while(bfs())
 98     {
 99         for(i = s; i <= t; i++) cur[i] = head[i];
100         sum -= dfs(s, INF);
101     }
102     printf("%d\n", sum);
103     return 0;
104 }
View Code

?

轉載于:https://www.cnblogs.com/zhenghaotian/p/6936100.html

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

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

相關文章

docker入門之容器網絡

docker入門之容器網絡首發&#xff1a;arppinging.com一、網絡命名空間1&#xff09;IP命令2&#xff09;實例二、網絡模型三、容器中常見的網絡操作1&#xff09;指定網絡模式2&#xff09;指定容器的dns地址和hosts解析四、網橋配置一、網絡命名空間1&#xff09;IP命令查看i…

光譜分布、光譜輻射通量密度與不同時間段分布光譜(圖示)

1、光譜分布圖 2 太陽輻射能量圖 3、不同時間段的太陽分布光譜圖 4、不同波長的光的能量分布主要區域 5、不同波段的使用場景

$.ajax()方法詳解

相關鏈接&#xff1a;http://blog.csdn.net/denghejing/article/details/41087581轉載于:https://www.cnblogs.com/Steven5007/p/8191275.html

【從零開始】Python字符串的操作方法

1. 字符串長度 #strlen(str)       # 字符串長度函數名str apples    # 把字符串 "apples" 賦值給變量 strprint (len(str))      # 打印字符串的長度 2. 查找字符 #strchr(str1,str2)      # 查找字符函數名str1 apples      …

SQL工廠法

表結構&#xff1a; exeno caption params sqlcommand tablename 201 登錄 loginname ftsring(20) select * from user where loginname:loginname user //autho…

基于深度學習和傳統算法的人體姿態估計,技術細節都講清楚了

計算機視覺的一大研究熱點是人體姿態估計&#xff0c;還有很多問題急需解決&#xff0c;比如遮擋&#xff0c;交互等等。在最近的CVPR2020里邊也有很多這方面的工作。本文站長主要是想談談基于深度學習的實時多人姿態估計。 人體姿態估計要干嘛&#xff1f; 關于人類活動規律的…

一些linux知識和http知識

一些linux知識和http知識 1 yum安裝比源碼編譯安裝 有的模塊不能自定義安裝 只能安裝默認的模塊進行安裝 2 關于php的fastcgi 如果使用fastcgi 那么需要啟動服務 如果不使用fastcgi 那么不需要啟動這個服務 3 一個完整的HTTP解析路徑 用戶瀏覽器比如訪問www.123.com/index.…

楊浦區阜盛農民工子弟小學見聞

天氣有些陰沉&#xff0c;起了個大早&#xff0c;一個小時奔波后來到了這里…… 大門口&#xff1a; 校領導&#xff1a; 有些破舊的校舍和陰沉的天空下祖國的希望&#xff1a; 同上&#xff0c;希望…… 期待的目光&#xff1a; 頑皮的笑臉&#xff0c;排著隊也要調皮&#xf…

《構建之法》7

十五章講的是穩定和發布階段。軟件生命周期的最后階段往往是最考驗團隊的。從代碼完成到最終發布軟件&#xff0c;需要經歷&#xff1a;完成代碼、集成測試、Bug修復、Alpha發布、DCR Bug修復、Beta發布、外部測試、RTO等。軟件團隊的各個角色代表&#xff0c;組成會診小組。對…

人體姿態估計算法之open pose

一&#xff0c;openpose是一種自底向上的算法&#xff1a; OpenPose人體姿態識別項目是美國卡耐基梅隆大學&#xff08;CMU&#xff09;基于卷積神經網絡和監督學習并以Caffe為框架開發的開源庫。可以實現人體動作、面部表情、手指運動等姿態估計。適用于單人和多人&am…

python練習5

import re from datetime import datetime, timezone, timedeltadef to_timestamp(dt_str, tz_str):# 時間dt_now datetime.strptime(dt_str, %Y-%m-%d %H:%M:%S)#時區tz_num int(re.match(\w{3}([|-]\d):00,tz_str).groups()[0])tz_utc timezone(timedelta(hours tz_num))…

搶火車票這個事吧,其實我也能做!(python黑科技)

2019獨角獸企業重金招聘Python工程師標準>>> 又是一年&#xff0c;馬上就要回家過年了&#xff0c;還沒有買到票的小伙伴們是否已經像熱鍋上的螞蟻了無腦的開始找黃牛了? 俗話說的好&#xff0c;求人不如求自己&#xff0c;搶票這玩意&#xff0c;其實我覺得我也可…

用 Python+openpose 實現抖音尬舞機

游戲開始后&#xff0c;隨著音樂會給出不同的動作提示&#xff0c;用戶按照提示擺出正確動作即可得分。援引官方說法&#xff0c;“尬舞機”主要應用了今日頭條 AI Lab 自主開發的“人體關鍵點檢測技術”&#xff0c;依靠這項技術&#xff0c;抖音能夠檢測到圖像中所包含人體的…

PHP獲取中文字符拼音首字母

在項目中遇到需要把游戲進行字母排序&#xff0c;于是百度到一個格式化的首字母的方法。 /*** name php獲取中文字符拼音首字母* param $str* return null|string*/public function getFirstCharter($str){if (empty($str)) {return ;}$fchar ord($str{0});if ($fchar > or…

Array類型

一、轉換方法 toString() 調用數組的toString()方法會返回由數組中每個值的字符串形式拼接而成的一個以逗號分割的字符串 valueOf() 返回的還是數組 實際上&#xff0c;為了創建這個字符串會調用數組每一項的toString()方法 二、棧方法 push() pop() 只發生在棧的頂部 三…

Create a Service Catalog Request via REST API

http://wiki.servicenow.com/index.php?titleUseful_Catalog_Scripts#Eureka http://wiki.servicenow.com/index.php?titleService_Catalog_Script_API#gsc.tab0 Service Catalog APIhttps://docs.servicenow.com/bundle/istanbul-servicenow-platform/page/integrate/inboun…

MYSQL和JAVA(課堂筆記)

MYSQL  數據庫管理工具 JAVA    編程語言 數據庫驅動&#xff08;JAVA和MYSQL對接方式&#xff09; 到官網上下載驅動    加載驅動 import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement;public class S…

解密昇騰AI處理器--Ascend310簡介

Ascend310 AI處理器規格 Ascend310 AI處理器邏輯架構 昇騰AI處理器本質上是一個片上系統&#xff08;System on Chip&#xff0c;SoC&#xff09;&#xff0c;主要可以應用在和圖像、視頻、語音、文字處理相關的應用場景。其主要的架構組成部件包括特制的計算單元、大容量的存儲…

銀盒子掃碼下單在線訂單開啟商品售賣時段使用說明

1&#xff0c;登陸管理員賬號&#xff0c;子賬號下&#xff0c;配置管理--店鋪配置--掃碼下單Tab頁&#xff0c;是否開啟商品售賣時段&#xff0c;選擇“是” 2&#xff0c;在商家后臺登陸相應的子賬號&#xff0c;在店鋪管理--商品售賣時段里配置售賣時間以及相應時段售賣的商…

使用pandas時遇到ValueError: numpy.dtype has the wrong size, try recompiling

[問題]使用pandas時遇到ValueError: numpy.dtype has the wrong size, try recompiling [原因] 這是因為 Python 包的版本問題&#xff0c;例如安裝了較舊版本的 Numpy&#xff0c;但安裝了較新版本的 Pandas。 [解決方法] 查看Numpy版本號 python -c "import numpy; prin…