UVALive 5903 Piece it together(二分圖匹配)

給你一個n*m的矩陣,每個點為'B'或'W'或'.'。然后你有一種碎片。碎片可以旋轉,問可否用這種碎片精確覆蓋矩陣。N,M<=500

WB ?《==碎片

? W

題目一看,感覺是精確覆蓋(最近被覆蓋洗腦了),但是仔細分析可以知道,DLX精確覆蓋不是正解。因為N*M=250,000遠超出DLX的可行規模(數百吧,我猜)。

然后感覺是貪心或者是抑或的什么的。。。。

看了別人的代碼,發現是最大匹配。。。然后就想。。。。對哦=。=其實黑點連2個白點就是匹配呀。。。。

不得不說網絡流構圖還是挺有趣的,如果你會構的話。。。。

?

首先,如果NB*2!=NW,那必然是NO,此處特判。

構圖是這樣,每個黑點拆分成2個,一個只連接左右鄰接的白點,一個只連接上下鄰接的白點。然后就匹配了=。=

規模分析:250,000/3*2=166,666個黑點(黑點拆分翻倍),250,000/3*2=166,666個白點。邊有166,666*2=333,332條。。

?

一開始寫完這題是TLE...然后改了5處從>30sec變成100ms,還是有點收獲的。。。

①如果某一個黑點匹配的那個match返回0而不是1,說明有黑點沒匹配到,可直接break;結果為NO。。。。>30sec ==> 27sec,TLE==>AC

②將maxn的500,000改成180,000,快了不少。。幾秒吧。。。原因應該是多case的mesmet head

③將2個for找B字符改成統計時存B字符位置。。也快了些。

④將加邊的順序改成先加左(上)邊的邊,再加右(下)邊的邊。。這個從17sec變成了3sec。。。

⑤將二分匹配的vis改成int,避免多次memset。。這個從3sec變成了100ms。。。

?

第一點顯然的剪枝,不說了。二三點好像快得也不是特別明顯,不說了。

第四點,假設某行某段是WBW,那先加左邊,再加右邊的結果是B->W2->W1,也就是優先右邊。。。這樣的話,

如果某行某段是 BWBWBWBWBWBW,那匹配的時候,每個B都只需要匹配一個就成功,不需要回溯。。。。這個的前提是順序匹配,即從1~2B

反之,如果先加右邊,再加左邊的結果是B->W1->W2,也就是優先左邊。。。那樣的話就要回溯多次(因為還有列的影響)。。但如果是逆序匹配,即從2B~1,速度還是幾秒

?

第五點。。。應該是最有力的改進了。。。。傳統的二分匹配的vis是bool,然后匹配前memset。。因為那些點一般是數百。。。

但是我們可以把vis改成int,匹配的時候把if(vis[v])continue;改成if(vis[v]==ID)continue;

二分圖最大匹配當時學得不夠深入啊╮(╯▽╰)╭。。。。今天學習了。。。。第四點是SF發現的。。。第五點是參考LC他們的。。。感謝SF陪我刷了一兩頁的AC...

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <algorithm>
 5 #include <cmath>
 6 #include <string>
 7 #include <vector>
 8 #include <queue>
 9 #include <set>
10 using namespace std;
11 
12 #define ll long long
13 #define inf 0x3f3f3f3f
14 #define eps 1e-8
15 #define maxn 180000
16 #define maxm 360000
17 
18 int vv[maxm],nxt[maxm];
19 int head[maxn],E;
20 void init(){memset(head,-1,sizeof(head));E=0;}
21 void addedge(int u,int v){
22     vv[E]=v,nxt[E]=head[u],head[u]=E++;
23 }
24 int pre[maxn];
25 int vis[maxn];
26 bool match(int x,int n,int ID){
27     for(int i=head[x];i!=-1;i=nxt[i]){
28         int v = vv[i]-n;
29         if(vis[v]==ID)continue;
30         vis[v] = ID;
31         if(pre[v]==-1 || match(pre[v],n,ID)){
32             pre[v]=x;
33             return true;
34         }
35     }
36     return false;
37 }
38 bool hungary(int n){
39     memset(pre,-1,sizeof(pre));
40     memset(vis,0,sizeof(vis));
41     for(int i=1;i<=n;++i)
42         if(match(i,n,i)==false)return false;
43     return true;
44 }
45 
46 char ch[555][555];
47 int idx[555][555];
48 int bx[maxn],by[maxn];
49 int main(){
50     int t;
51     scanf("%d",&t);
52     while(t--){
53         int nn,mm;
54         scanf("%d%d",&nn,&mm);
55         memset(ch,0,sizeof(ch));
56         for(int i=1;i<=nn;++i)scanf("%s",ch[i]+1);
57         int B=0,W=0;
58         for(int i=1;i<=nn;++i)for(int j=1;j<=mm;++j)
59             if(ch[i][j]=='B')idx[i][j]=++B,bx[B]=i,by[B]=j;
60             else if(ch[i][j]=='W')idx[i][j]=++W;
61         if(B*2!=W){puts("NO");continue;}
62         init();
63         for(int b=1;b<=B;++b){
64             int i=bx[b],j=by[b];
65             if(ch[i-1][j]=='W')addedge(idx[i][j],B*2+idx[i-1][j]);
66             if(ch[i+1][j]=='W')addedge(idx[i][j],B*2+idx[i+1][j]);
67             if(ch[i][j-1]=='W')addedge(idx[i][j]+B,B*2+idx[i][j-1]);
68             if(ch[i][j+1]=='W')addedge(idx[i][j]+B,B*2+idx[i][j+1]);
69         }
70         if(hungary(B<<1))puts("YES");
71         else puts("NO");
72     }
73     return 0;
74 }
View Code

?

?

轉載于:https://www.cnblogs.com/nextbin/p/3706021.html

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

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

相關文章

將undefault和null的數據轉換成bool類型的數據 使用!!

<script> var o{}; var anull; console.info(!!o.name); </script> 輸出false 此方法是將undefault和null的數據轉換成bool類型的數據. var model avalon.define({ $id: model, defaultvalue {},});<span ms-if"!!defaultvalue .cost" >測試</…

springcloud(五):熔斷監控Hystrix Dashboard和Turbine

Hystrix-dashboard是一款針對Hystrix進行實時監控的工具&#xff0c;通過Hystrix Dashboard我們可以在直觀地看到各Hystrix Command的請求響應時間, 請求成功率等數據。但是只使用Hystrix Dashboard的話, 你只能看到單個應用內的服務信息, 這明顯不夠. 我們需要一個工具能讓我們…

如何修改PKG_CONFIG_PATH環境變量

兩種情況&#xff0c;如果你只是想加上某庫的pkg&#xff0c;則選擇下面其一&#xff1a;export PKG_CONFIG_PATH/usr/lib/pkgconfig/ 或者 export PKG_CONFIG_LIBDIR/usr/lib/pkgconfig/ 如果你想覆蓋掉原來的pkg,選擇后者。因為&#xff1a;PKG_CONFIG_LIBDIR的優先級比 PKG_…

python跨包導入包_python引入跨模塊包

人生苦短&#xff0c;我學python。最近學習python&#xff0c;由于包的模塊分的比較多。所以要用到跨模塊引入 且調用中間的方法整體目錄結構如下。需求&#xff1a;在 API模塊 user.py 中 調用 plugin 模塊中 douyin_login 下的方法。貼一下最終解決方案&#xff1a;from plug…

jdk1.8版本已經不包含jdbc.odbc連接

連接access的時候發現報錯&#xff0c;無法加載jdbc.odbc類文件&#xff0c;到Java安裝目錄上jre/lib/rt.jar上找jdbcodbc類也沒有了。 找個jdk1.7安裝就ok啦。轉載于:https://www.cnblogs.com/dohn/p/3707254.html

位運算問題

位運算 位運算是把數字用二進制表示之后&#xff0c;對每一位上0或者1的運算。 理解位運算的第一步是理解二進制。二進制是指數字的每一位都是0或者1.比如十進制的2轉化為二進制之后就是10。在程序員的圈子里有一個流傳了很久的笑話&#xff0c;說世界上有10種人&#xff0c;一…

conda環境管理介紹

我們可以使用conda 來切換不同的環境&#xff0c;主要的用法如下&#xff1a; 1. 創建環境 # 指定python版本為2.7&#xff0c;注意至少需要指定python版本或者要安裝的包 # 后一種情況下&#xff0c;自動安裝最新python版本conda create -n env_name python2.7# 同時安裝必…

unable to execute dex: multiple dex files Cocos2dxAccelerometer

原文轉載&#xff1a;http://discuss.cocos2d-x.org/t/conversion-to-dalvik-format-failed-unable-to-execute-dex-multiple-dex-files-define-lorg-cocos2dx-lib-cocos2dxaccelerometer/6652/4 用cocos2dx2.2.3沒問題&#xff0c;用了3.1.1出現這個問題。確實夠蛋疼。還要有這…

PHP javascript 值互相引用(不用刷新頁面)

PHP javascript 值互相引用的問題 昨天通過EMAIL給一些公司投了簡歷&#xff0c;希望他們能給我一份工作&#xff0c;今天其中一家公司的人給我打電話&#xff0c;大意是要我做一點東西&#xff08;與AJAX有關&#xff09; 給他們看&#xff0c;我聽打電話的人問我的問題&#…

mysql自增_面試官:為什么 MySQL 的自增主鍵不單調也不連續?

為什么這么設計(Why’s THE Design)是一系列關于計算機領域中程序設計決策的文章&#xff0c;我們在這個系列的每一篇文章中都會提出一個具體的問題并從不同的角度討論這種設計的優缺點、對具體實現造成的影響。如果你有想要了解的問題&#xff0c;可以在文章下面留言。當我們在…

caffe 初學參考鏈接

最近在學習caffe&#xff0c;也搜集了一些資料&#xff0c;主要是一些網上公開的博客資源&#xff0c;現匯總一下&#xff0c;以便后面參考。 caffe 安裝 編譯py-faster-rcnn全過程caffe依賴庫安裝&#xff08;非root&#xff09;編譯py-faster-rcnn的問題匯總及解決方法 ca…

java timer 定時任務

監聽類1 package com.xx.model;2 3 import java.util.Calendar;4 import java.util.Date;5 import java.util.Timer;6 import javax.servlet.ServletContextEvent;7 import javax.servlet.ServletContextListener;8 import org.apache.commons.logging.Log;9 import org.apache…

python 打開txt_在python中從txt文件打開鏈接

我想請求一個rss程序的幫助。我所做的是收集包含我項目相關信息的網站&#xff0c;然后檢查它們是否有rss提要。鏈接存儲在txt文件中(每行一個鏈接)。因此&#xff0c;我有一個txt文件&#xff0c;其中包含了需要檢查rss的基本url。在我找到了這個代碼&#xff0c;這會使我的工…

IOS-awakeFromNib和viewDidLoad

awakeFromNib 當.nib文件被加載的時候&#xff0c;會發送一個awakeFromNib的消息到.nib文件中的每個對象&#xff0c;每個對象都可以定義自己的 awakeFromNib函數來響應這個消息&#xff0c;執行一些必要的操作。也就是說通過nib文件創建view對象是執行awakeFromNib 。 viewDid…

使用過濾統計信息解決基數預估錯誤

基數預估是SQL Server里一顆隱藏的寶石。一般而言&#xff0c;基數預估指的是&#xff0c;在查詢編譯期間&#xff0c;查詢優化器嘗試找出在執行計劃里從各個運算符平均返回的行數。這個估計用來驅動計劃本身生成并選擇正確的計劃運算符——例如像Nested Loop, Merge Join,還是…

faster-rcnn系列學習之準備數據

如下列舉了 將數據集做成VOC2007格式用于Faster-RCNN訓練的相關鏈接。 RCNN系列實驗的PASCAL VOC數據集格式設置 制作VOC2007數據集用于Faster-RCNN訓練 將數據集做成VOC2007格式用于Faster-RCNN訓練 這一篇比較詳細地介紹了如何制造voc2007的所有文件&#xff0c;內含相關軟件…

C# 委托鏈、多路廣播委托

委托鏈、多路廣播委托&#xff1a;也就是把多個委托鏈接在一起,我們把鏈接了多個方法的委托稱為委托鏈或多路廣播委托 例&#xff1a; 1 class HelloWorld2 {3 //定義委托類型4 delegate void DelegationChain();5 static void Main(string[] args)6 …

openssl 生成證書_使用證書和私鑰導出P12格式個人證書!

【OpenSSL】使用證書和私鑰導出P12格式個人證書1, 產生CA證書1.1, 生成ca的私鑰openssl genrsa -out cakey.pem 20481.2, 生成ca的自簽名證書請求openssl req -new -key cakey.pem -subj "/CNExample Root CA" -out cacsr.pem1.3, 自簽名ca的證書openssl x509 -req -…

PHP (20140505)

數據庫表與表之間的連接是用id聯系。 join on&#xff1b;轉載于:https://www.cnblogs.com/sunshine-c/p/3710283.html

py-faster-rcnn代碼roidb.py的解讀

roidb是比較復雜的數據結構&#xff0c;存放了數據集的roi信息。原始的roidb來自數據集&#xff0c;在trian.py的get_training_roidb(imdb)函數進行了水平翻轉擴充數量&#xff0c;然后prepare_roidb(imdb)【定義在roidb.py】為roidb添加了一些說明性的屬性。 在這里暫時記錄下…