734. [網絡流24題] 方格取數問題 二分圖點權最大獨立集/最小割/最大流

?問題描述:
在一個有m*n 個方格的棋盤中,每個方格中有一個正整數。現要從方格中取數,使任
意2 個數所在方格沒有公共邊,且取出的數的總和最大。試設計一個滿足要求的取數算法。
?編程任務:
對于給定的方格棋盤,按照取數要求編程找出總和最大的數。
?數據輸入:
由文件grid.in提供輸入數據。文件第1 行有2 個正整數m和n,分別表示棋盤的行數
和列數。接下來的m行,每行有n個正整數,表示棋盤方格中的數。

【問題分析】

二分圖點權最大獨立集,轉化為最小割模型,從而用最大流解決。

【建模方法】

首先把棋盤黑白染色,使相鄰格子顏色不同,所有黑色格子看做二分圖X集合中頂點,白色格子看做Y集合頂點,建立附加源S匯T。

1、從S向X集合中每個頂點連接一條容量為格子中數值的有向邊。
2、從Y集合中每個頂點向T連接一條容量為格子中數值的有向邊。
3、相鄰黑白格子Xi,Yj之間從Xi向Yj連接一條容量為無窮大的有向邊。

求出網絡最大流,要求的結果就是所有格子中數值之和減去最大流量。

【建模分析】

這是一個二分圖最大點權獨立集問題,就是找出圖中一些點,使得這些點之間沒有邊相連,這些點的權值之和最大。獨立集與覆蓋集是互補的,求最大點權獨立集可以轉化為求最小點權覆蓋集(最小點權支配集)。最小點權覆蓋集問題可以轉化為最小割問題解決。結論:最大點權獨立集 = 所有點權 - 最小點權覆蓋集 = 所有點權 - 最小割集 = 所有點權 - 網絡最大流。

對于一個網絡,除去冗余點(不存在一條ST路徑經過的點),每個頂點都在一個從S到T的路徑上。割的性質就是不存在從S到T的路徑,簡單割可以認為割邊關聯的非ST節點為割點,而在二分圖網絡流模型中每個點必關聯到一個割點(否則一定還有增廣路,當前割不成立),所以一個割集對應了一個覆蓋集(支配集)。最小點權覆蓋集就是最小簡單割,求最小簡單割的建模方法就是把XY集合之間的變容量設為無窮大,此時的最小割就是最小簡單割了。

/* * Problem: 線性規劃與網絡流24題 #9 方格取數問題* Author: Guo Jiabao* Time: 2009.6.27 19:06* State: Solved* Memo: 網絡最大流 二分圖點權最大獨立集
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
using namespace std;
const int MAXL=50,MAXN=50*50,MAXM=MAXN*8,INF=~0U>>1;
const int dx[]={0,0,-1,1},dy[]={-1,1,0,0};
struct edge
{edge *next,*op;int t,c;
}*V[MAXN],*P[MAXN],ES[MAXM],*Stae[MAXN];
int N,M,S,T,C,EC,Ans,Maxflow,Total;
int Lv[MAXN],Stap[MAXN],Map[MAXL][MAXL];
inline void addedge(int a,int b,int c)
{ES[++EC].next = V[a]; V[a]=ES+EC; V[a]->t=b; V[a]->c=c;ES[++EC].next = V[b]; V[b]=ES+EC; V[b]->t=a; V[b]->c=0;V[a]->op = V[b]; V[b]->op = V[a];
}
void init()
{int i,j,k,c;freopen("grid.in","r",stdin);freopen("grid.out","w",stdout);scanf("%d%d",&M,&N);S=0; T=N*M+1;for (i=1;i<=M;i++){for (j=1;j<=N;j++){scanf("%d",&c);Total += c;Map[i][j] = ++C;if ((i+j)%2==0)addedge(S,C,c);elseaddedge(C,T,c);}}for (i=1;i<=M;i++){for (j=1;j<=N;j++){if ((i+j)%2==0){for (k=0;k<4;k++){int x=i+dx[k],y=j+dy[k];if (x>=1 && x<=M && y>=1 && y<=N)addedge(Map[i][j],Map[x][y],INF);}}}}
}
bool Dinic_Label()
{int head,tail,i,j;Stap[head=tail=0]=S;memset(Lv,-1,sizeof(Lv));Lv[S]=0;while (head<=tail){i=Stap[head++];for (edge *e=V[i];e;e=e->next){j=e->t;if (e->c && Lv[j]==-1){Lv[j] = Lv[i]+1;if (j==T)return true;Stap[++tail] = j;}}}return false;
}
void Dinic_Augment()
{int i,j,delta,Stop;for (i=S;i<=T;i++)P[i] = V[i];Stap[Stop=1]=S;while (Stop){i=Stap[Stop];if (i!=T){for (;P[i];P[i]=P[i]->next)if (P[i]->c && Lv[i] + 1 == Lv[j=P[i]->t])break;if (P[i]){Stap[++Stop] = j;Stae[Stop] = P[i];}elseStop--,Lv[i]=-1;}else{delta = INF;for (i=Stop;i>=2;i--)if (Stae[i]->c < delta)delta = Stae[i]->c;Maxflow += delta;for (i=Stop;i>=2;i--){Stae[i]->c -= delta;Stae[i]->op->c += delta;if (Stae[i]->c==0)Stop = i-1;}}}
}
void Dinic()
{while (Dinic_Label())Dinic_Augment();
}
int main()
{init();Dinic();Ans = Total - Maxflow;printf("%d\n",Ans);return 0;
}

?

轉載于:https://www.cnblogs.com/Aragaki/p/7554744.html

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

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

相關文章

Nginx 基礎 ( 二)

一、HTTP請求 http請求包括客戶端請求服務端 以及 服務端響應數據回客戶端&#xff0c;如下 請求&#xff1a;包括請求行、請求頭部、請求數據 響應&#xff1a;包括狀態行、消息報頭、響應正文 比如在Linux中curl請求網站獲取請求信息和響應信息 curl -v http://www.kugou.com…

《金融行業應用解決方案白皮書》發布,金融自主創新未來可期!

日前&#xff0c;以“聚勢賦能 行業共創”為主題的金融行業解決方案發布會在線上舉行。麒麟軟件發布《金融行業應用解決方案白皮書》&#xff0c;并發起成立“金融機具生態圈俱樂部”&#xff0c;助力金融行業用戶高質量發展。金融信息系統曾經被國外廠商壟斷金融信息系統作為國…

leetcode53 Maximum Subarray 最大連續子數組

題目要求 Find the contiguous subarray within an array (containing at least one number) which has the largest sum.For example, given the array [-2,1,-3,4,-1,2,1,-5,4], the contiguous subarray [4,-1,2,1] has the largest sum 6.即&#xff1a;尋找數列中的一個子…

黑馬程序員-WEB前端與移動開發就業班

Web前端 — IT互聯網的“門面”有人的地方就有江湖&#xff0c;有網站的地方就有Web前端&#xff0c;無所不用&#xff0c;互聯網大勢所在。課程循序漸進&#xff0c;技術小白課快速上手課程結構由淺入深&#xff0c;基礎課程講解充分&#xff0c;了解網頁的結構組成、分析頁面…

詳解go語言的array和slice 【二】

上一篇 詳解go語言的array和slice 【一】已經講解過,array和slice的一些基本用法&#xff0c;使用array和slice時需要注意的地方&#xff0c;特別是slice需要注意的地方比較多。上一篇的最后講解到創建新的slice時使用第三個索引來限制slice的容量&#xff0c;在操作新slice時…

詳解Objective-C的meta-class

2019獨角獸企業重金招聘Python工程師標準>>> 比較簡單的一篇英文&#xff0c;重點是講解meta-class。翻譯下&#xff0c;加深理解。 原文標題&#xff1a;What is a meta-class in Objective-C? 原文地址&#xff1a;http://www.cocoawithlove.com/2010/01/what-is…

Nginx 模塊的使用

Nginx模塊的使用,就是在Nginx配置文件中的http、server、location中添加參數&#xff0c;進行多一項或幾項處理一、 實現響應內容替換 1、sub_module二、Nginx的請求限制 1、連接頻率限制 limit_conn_module 2、請求頻率限制 limit_req_module 注: HTTP請求建立在一次…

Question | 網站被黑客掃描撞庫該怎么應對防范?

本文來自網易云社區在安全領域向來是先知道如何攻&#xff0c;其次才是防。針對題主的問題&#xff0c;在介紹如何防范網站被黑客掃描撞庫之前&#xff0c;先簡單介紹一下什么是撞庫。撞庫是黑客通過收集互聯網已泄露的用戶和密碼信息&#xff0c;生成對于的字典表&#xff0c;…

十倍程序員 | 使用 Source Generator 將 JSON 轉換成 C# 類

前言有時候&#xff0c;我們需要將通過 WebAPI 接收 JSON 字符串轉換成 C# 代碼。Visual Studio 提供了一個功能菜單可以輕松實現&#xff1a;執行完成后&#xff0c;它會將生成的代碼放在打開的的代碼窗口中。但是&#xff0c;如果有多個 JSON 字符串需要轉換&#xff0c;這個…

Delphi對話框初始地址InitialDir

我的電腦&#xff1a;SaveDialog1.InitialDir : ::{20D04FE0-3AEA-1069-A2D8-08002B30309D};// My Computer {20D04FE0-3AEA-1069-A2D8-08002B30309D}// Network Neighborhood {208D2C60-3AEA-1069-A2D7-08002B30309D}// Recycled {645FF040-5081-101B-9F08-00AA002F954E} 另外…

[python] 解決pip install download速度過慢問題 更換豆瓣源

""" python建立pip.ini.py 2016年4月30日 03:35:11 codegay """import osini"""[global] index-url https://pypi.doubanio.com/simple/ [install] trusted-hostpypi.doubanio.com """ pippathos.environ["…

Maven組件通過命令上傳本地和私有倉庫

安裝本地包到本地倉庫&#xff1a;mvn install:install-file -DgroupIdcom.xxx -DartifactIdmqtt-server-client -Dversion1.0.1 -Dpackagingjar -DfileE:\__vdt\MVVP\mqtt-server-client-1.0.1.jar -DpomFileE:\__vdt\MVVP\pom.xml安裝本地包到私有倉庫&#xff1a;mvn deploy…

Nginx -靜態資源Web服務

一、靜態資源類型 注&#xff1a;非服務器動態生成的文件 1、瀏覽器端渲染 HTML、css、js 2、圖片 jpeg、gif、png 3、視頻 flv、MPEG 4、文件 TXT、等任意下載文件二、靜態資源服務配置1、配置語法-文件讀取 syntax&#xff1a;sendfile on|off default&#xff1a;sendfi…

微軟Microsoft Azure 機器學習工作室的案例之Image Classification using DenseNet

點擊上方藍字關注我們&#xff08;本文閱讀時間&#xff1a;10分鐘)Microsoft Azure Machine Learning Studio是微軟強大的機器學習平臺&#xff0c;在設計器中&#xff0c;微軟內置了15個場景案例&#xff0c;但網上似乎沒有對這15個案例深度刨析的分析資料&#xff0c;所以我…

java小基礎之instanceof運算符

instanceof主要用來判斷一個類是否實現了某個接口&#xff0c;或者判斷一個實例對象是否屬于一個類。 1. 判斷一個對象是否屬于一個類 boolean result p instanceof Student; 2. 對象類型強制轉換前的判斷 Person p new Student(); //判斷對象p是否為Student類的實例 if(p in…

音樂分類

代碼&#xff1a; 1 import numpy as np2 from scipy import fft3 from scipy.io import wavfile4 from sklearn.linear_model import LogisticRegression5 import random6 """7 使用logistic regression處理音樂數據&#xff0c;音樂數據訓練樣本的獲得是使…

Problem C: 類的初體驗(III)

Description 定義一個類Data&#xff0c;只有一個double類型的屬性和如下4個方法&#xff1a; 1. 缺省構造函數&#xff0c;將屬性初始化為0&#xff0c;并輸出“Initialize a data 0”。 2. 帶參構造函數&#xff0c;將屬性初始化為指定參數&#xff0c;并輸出“Initialize…

Nginx- 實現跨域訪問

一、什么是跨域 跨域&#xff1a;由于瀏覽器的同源策略&#xff0c;即屬于不同域的頁面之間不能相互訪問各自的頁面內容。詳細見下表&#xff1a; 注&#xff1a;同源策略&#xff0c;單說來就是同協議&#xff0c;同域名&#xff0c;同端口 URL說明是否允許通信http://www.a…

不管對不對,先把鬧鐘關了再說

小榆提前關閉早上鬧鐘&#xff0c;幾乎工作日的早晨都是被這魔怔的鈴聲給拉扯醒&#xff0c;無論有多么不愿還是痛苦&#xff0c;可對這鬧鐘也無可奈何&#xff0c;就算一時果斷掐掉接下來是另一回麻煩事。最后一天&#xff0c;已經顧不得多少&#xff0c;沒什么令人懼怕的人或…

pycharm(windows)安裝及其設置中文菜單

pycharm&#xff08;windows&#xff09;安裝及其設置中文菜單 1.下載 在官網&#xff08;http://www.jetbrains.com/pycharm/download/#sectionwindows&#xff09;進行下載 或者到百度云進行下載 專業版&#xff1a;鏈接&#xff1a;http://pan.baidu.com/s/1bSSRds 密碼&…