題目傳送門
題目大意:給出一張圖,現在讓你在某些點上建救援出口,要求在隨便乙個點坍塌(即被刪除)後剩餘的點都可以到達乙個救援出口,問至少建幾個救援出口以及方案數。
很顯然能夠聯想到點雙,我們考慮乙個點雙裡面的割點數量:
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的乙個題 首先我們可以發現,把割頂塗上是不優的。因為刪掉它之後,因此被和原圖斷掉的那一部分就沒有黑點了,它對不連通的分量產生不了任何貢獻。所以我們要先預處理出來點雙聯通分量的割頂,不塗割頂。其次,對於乙個雙聯通分量來講,我們到底要塗幾個呢?其實乙個就夠了,因...