DAY 3

圖論


 

HDU5093數據結構

 

 

 

同一行或者同一列,而且沒有障礙網站

n,m<=100spa

 

感受是二分圖?.net

咋感受出來的???3d

沒有障礙的狀況:一行最多放一個,一列最多放一個調試

或者說一個物體用掉一行一列orm

二分圖:左邊表明每一行,右邊表明每一列blog

                                 

 

 

 

因爲沒有障礙物,左邊的每個點都會向右邊每個點連一條邊編譯

匹配的結果就是min(n,m)class

怎麼解決障礙物?

障礙物的做用:佔了一個格子,把每行拆成兩部分,每列拆成兩部分

好比一行有兩個障礙,這一行就是三個部分,那麼把這三個部分建三個點,列同理

那麼獲得一張新的二分圖

而後跑一遍匈牙利就行了

                

 

 

 

                        

 

 

 

 

對角線指左上到右下

二分圖

左邊的點是行,右邊是列

保證一開始選出來的1不在同一行,同一列

若是(i,j)是1,就把左邊的i和右邊的j連邊,看看最後的最大匹配數是否是大於等於N

                          

 

 

 

2-SAT

 

有n個bool變量x1~xn,有m個位運算的表達式(只有兩個變量),求是否有一種方法使得m個表達式都成立

 

對於每個變量建兩個點,一個是true,一個是false。邊就從m個表達式來

 

好比x1&x2=false  -->  x1==false||x2==false

 

從x1的true向x2的false連一條有向邊,表明x1=true時,x2=false

 

從x2的true向x1的false連一條有向邊,表明x2=true時,x1=false

 

這個邊實際上表明一種推導關係

 

x2||x3=true  -->  從x2的false向x3的true連邊,從x3的false向x2的true連邊

 

x4&x5=true  -->  x4=true  x5=true

 

若是x4必須等於true,就把x4=false向x4的false連邊,x5同理

 

怎麼判斷有無解?

 

若是某一個點的true出發可以走到他的false,從false也能走到true,就說明誤解

 

也就是說一個變量的兩個取值在同一個強連通份量內

 

 

                                         

 

 

 

先建圖,而後跑tarjan,若是有一個變量的兩個取值在同一個強連通份量內就無解

                                   

 

 

 

全部炸彈爆炸的最小值最大是多少

既然最小的是r,不如讓全部的都是r

怎麼判斷有解?

要麼選第一個炸彈,要麼選第二個炸彈,對應2-sat的兩種取值

                                     

 

 

 

若是兩個炸彈可以互相炸到,就說明他倆不能同時選,那麼就把一個向另外一個建邊

N^3暴力建邊而後tarjan

二分+2-sat

 

歐拉回路和哈密爾頓迴路?先咕着。。

安利一個查題的網站 vjudge.net(可是貌似不太穩定)   

                               

 

 

 

骨牌的黑色必須對應黑色,白色必須對應白色,而且骨牌不重疊

                                          

 

 

 

n,m<=50?

 

n,m<=100?

 

n,m<=1000?

 

1.

 

有一些格子有障礙,不能放置骨牌

 

若是骨牌是1*2的話,黑格子和白格子二分圖匹配

 

一個黑格子配兩個白格子?

 

把一個黑的變成兩個黑的?這樣就能兩個配兩個。可是把一個黑點拆成兩個黑點,向周圍的四個白點連線,有可能會出現兩個黑點分別選擇左右或者上下的狀況。怎麼改?

 

L形有四種狀況,即選的白格子爲上左,上右,下左,下右。

 

那麼只須要把黑格子拆成兩個黑格子,一個連上下,一個連左右

 

看看全部的黑格子,白格子有沒有被匹配上,若是匹配完了的話就說明能夠

 

2.

 

n,m<=1000

 

 

 

S-SAT

 

四種不一樣的取值 sat4以後、我問題

 

左右選點,上下選點,爲每個節點設置兩個變量

                             

 

 

 

曼哈頓距離不超過2的兩個黑格子建邊,2-sat,複雜度o(nm)

                                              

 

 

                                                

 

 

 

 

 

 

 

 

 

變量:每一個提案被經過仍是否決0/1

建邊:每一個人會對不超過4個提案進行投票?

       若是隻投了一票反對票,那麼這個提案必須被否決。把這個提案的贊成向否決連邊

                            

 

 

若是兩票,則都要知足

 

 

                                        

 

                                    

 

 

 

 

若是三票,至多有一票不被知足,枚舉是哪一票

                                 

 

 

                                  

 

 

若是四票,仍然是至多一票不被知足,同上一種狀況

建完圖以後,若是一個提案的經過能走到它本身的否決,就必須選擇否決,若是否決能走到經過,就必須選擇經過。

不然就不肯定

若是數據增強到10w

Tarjan縮點強聯通份量DAG樹上倍增 

若是四票,仍然是至多一票不被知足,同上一種狀況

建完圖以後,若是一個提案的經過能走到它本身的否決,就必須選擇否決,若是否決能走到經過,就必須選擇經過。

不然就不肯定

若是數據增強到10w

Tarjan縮點強聯通份量DAG樹上倍增

                                 

 

 

 

 

 

考慮把圖變成樹而後再作?

樹是一個二分圖(沒有換,奇數深度點放左邊,偶數角度點放右邊)

圖咋變成樹?縮點,生成樹

一張圖若是不是二分圖說明有基環,那麼刪去的邊應該是全部基環的交集

先把這張圖隨便求一顆生成樹,那麼全部的邊就能夠分爲樹邊和非樹邊。若是沒有非樹邊的話就是二分圖了,而這些非樹邊鏈接了兩個一樣顏色的點致使出現了基環。目標就是刪掉這樣的邊使得全部的基環都被破壞掉

若是隻有一條鏈接兩個相同顏色節點的邊,就說明只要刪掉這個基環上面任何一條邊

若是有兩條及以上的非樹邊造成基環,那麼不能刪掉一條非樹邊來知足要求,因此刪去的必定是樹邊,且被全部的基環所覆蓋

若是一條邊被一個基環所覆蓋,就把這一個基環的邊權值加一。最後只須要找被全部的基環通過的邊就能夠了

用數據結構維護。能夠樹上差分或者線段樹,樹剖

                                

 

 

                                                         

 

 

 

觀察得A國必須是一奇一偶,因此最多兩我的,枚舉就好了

而後找出在B國的最大朋友圈

B國的朋友關係有什麼性質?

B國的人能夠分紅奇數和偶數兩部分,奇數的人互相是朋友,全部偶數互相是朋友

第二個條件就是在兩個集合之間連邊

                                            

 

 

二分圖是左邊沒有連邊,右邊沒有連邊,中間有連邊

那麼這張圖就是二分圖的補圖(有的邊去掉,沒有的加上)

或者說對它求一個補圖就是二分圖

 

求一個最大朋友圈,就是在補圖上求一個最大獨立集

若是最大匹配是x,那麼最大獨立集必定是x,n-x,m-x,n+m-x,n+m-2x中的一個

這個題是n+m-x

由於每有一對匹配,能選的點就會少一個,有x對就是少一個,因此是n+m-x,詳細證實建最大流最小割定理

                                                      

 

                          

 

 

咱們確定要考慮策略

咱們發現每種顏色的格子最多兩種,這說明了什麼?

先考慮每種顏色的格子只有一個

那麼答案必定不超過min(ca+2cb,2ca+cb)

爲何?

考慮其中某一行,要使得這一行變成想要的樣子,就須要知道應該移到這一個位置格子的原來在哪一行

先把列錯開,在把列換成行,再把行內部調整好

先操做行同理

要求的是最小值,那一個系列怎麼作?能夠經過暴力檢查

兩個怎麼作?ca+cb

是否是每個東西都能錯到他所在的那一列上

知道每一行的每個格子應該到第幾列去

檢查可不可能就是檢查這一行有沒有兩個格子須要錯到相同的列上,有的話就說明必需要第三步

列去行同理

dfs每一個格子去哪裏,是去和它第一個同樣的仍是第二個同樣的

複雜度2^45000  什麼鬼東西

2-SAT

兩個格子 a,b,把他們移動到A,B去,變量是什麼?

只有兩種狀況,a->A,b->B或a->B,b->A

那就能夠建兩個變量表示去哪裏

怎麼建邊?

 

                                  

 

 

判斷能不能兩輪操做完成問題

保證同一行內沒有去往同一列的格子

若是(a,c)在同一行,(A,C)在同一列,那麼就意味着不可能經過兩輪操做完成目標

那麼若是a去A,c就只能去B

同理,若是c去C,a只能去B

                                           

 

                                      

 

 

一點閒話:

考試的最後10~15分鐘

1.檢查可否過編譯

2.考試時候隨時文件輸入輸出

3.檢查文件名有沒有打錯

4.檢查有沒有沒刪調試信息

5.掃雷很好玩(大霧

相關文章
相關標籤/搜索