HDU5093數據結構
同一行或者同一列,而且沒有障礙網站
n,m<=100spa
感受是二分圖?.net
咋感受出來的???3d
沒有障礙的狀況:一行最多放一個,一列最多放一個調試
或者說一個物體用掉一行一列orm
二分圖:左邊表明每一行,右邊表明每一列blog
因爲沒有障礙物,左邊的每個點都會向右邊每個點連一條邊編譯
匹配的結果就是min(n,m)class
怎麼解決障礙物?
障礙物的做用:佔了一個格子,把每行拆成兩部分,每列拆成兩部分
好比一行有兩個障礙,這一行就是三個部分,那麼把這三個部分建三個點,列同理
那麼獲得一張新的二分圖
而後跑一遍匈牙利就行了
對角線指左上到右下
二分圖
左邊的點是行,右邊是列
保證一開始選出來的1不在同一行,同一列
若是(i,j)是1,就把左邊的i和右邊的j連邊,看看最後的最大匹配數是否是大於等於N
有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.掃雷很好玩(大霧