HNOI 2012 礦場搭建 題解

2021-09-29 14:58:55 字數 1482 閱讀 3696

題目傳送門

題目大意:給出一張圖,現在讓你在某些點上建救援出口,要求在隨便乙個點坍塌(即被刪除)後剩餘的點都可以到達乙個救援出口,問至少建幾個救援出口以及方案數。

很顯然能夠聯想到點雙,我們考慮乙個點雙裡面的割點數量:

0個時說明這個點雙與其他的點雙之間沒有聯絡,那麼這個點雙內部至少要建兩個救援出口,因為是點雙,所以建在**都可以,不能只建乙個,因為如果恰好是那個點塌了就完了。

1個時說明這個點雙與另乙個點雙之間有聯絡,那麼這個點雙裡面就只需要建乙個救援出口,如果這個出口塌了,剩下的點也可以去另乙個點雙裡面找救援出口,如果那個割點塌了,那麼這個點雙內的點去這個點雙裡面的救援出口就好了。

大於等於2個時無論哪乙個點塌了,這個點雙裡面的點都可以去其他點雙裡面找救援出口,所以這個點雙裡面不需要建救援出口。

然後還有乙個要注意的,不能在割點上建救援出口,想想就明白了。然後剩下的方案數隨便搞搞就出來了,並不是重點。

**:

#include

#include

#include

#include

using

namespace std;

#define maxn 510

int n,m,s[maxn<<1]

,t;map<

int,

int> mp;

struct rd

;rd road[maxn]

;struct edge

;edge e[maxn<<1]

;int first[maxn]

,len;

void

buildroad

(int x,

int y)

; first[x]

=len;

}int dfn[maxn]

,low[maxn]

,id;

bool cut[maxn]

;void

dfs1

(int x,

int fa)

else

if(dfn[y]

)low[x]

=dfn[y];}

if(fa==-1

&&son==

1)cut[x]

=false;}

long

long ans1,ans2;

struct par

par operator+(

const par &b)};

par dfs2

(int x,

int fa)

return re;

}int tot;

intmain()

printf

("case %d: %lld %lld\n"

,tot,ans1,ans2);}

}

HNOI2012 礦場搭建

題目鏈結 演算法 對於任何乙個聯通塊,如果坍塌的是乙個聯通塊中的割點的話,那麼分割成的兩個小聯通塊中必須保證各有乙個出口。我們考慮所有的割點將原圖分割成若干個小聯通塊接下來分類討論 1 小塊不與任何乙個割點相連,那我們需要在這裡設立兩個出口,以保證任何乙個出口坍塌後,還有乙個出口可用。2 小塊只與乙...

HNOI2012 礦場搭建

顯然需要求一下點雙 然後列舉每乙個點雙,考慮進行分類討論 如果這乙個聯通塊裡面只有這乙個點雙,也就是這個點雙裡面沒有割點,那麼我們至少需要建造兩個出口,才能保證能跑出去 因為有可能選的那個塌了 如果這個點雙裡面有乙個割點,那麼有兩種情況,一種是割點塌了,這樣我們需要選出1個點,或者割點沒塌,這樣我們...

HNOI2012 礦場搭建

其實是劉汝佳藍書上面的例題啦,wf2011的乙個題 首先我們可以發現,把割頂塗上是不優的。因為刪掉它之後,因此被和原圖斷掉的那一部分就沒有黑點了,它對不連通的分量產生不了任何貢獻。所以我們要先預處理出來點雙聯通分量的割頂,不塗割頂。其次,對於乙個雙聯通分量來講,我們到底要塗幾個呢?其實乙個就夠了,因...