HNOI2012 礦場搭建 割點

2022-07-01 11:39:17 字數 1832 閱讀 9898

[hnoi2012]礦場搭建(

煤礦工地可以看成是由隧道連線挖煤點組成的無向圖。為安全起見,希望在工地發生事故時所有挖煤點的工人都能有一條出路逃到救援出口處。

於是礦主決定在某些挖煤點設立救援出口,使得無論哪乙個挖煤點坍塌之後,其他挖煤點的工人都有一條道路通向救援出口。

請寫乙個程式,用來計算至少需要設定幾個救援出口,以及不同最少救援出口的設定方案總數。

輸入檔案有若干組資料,每組資料的第一行是乙個正整數 n(n ≤ 500),表示工地的隧道數,

接下來的n行每行是用空格隔開的兩個整數s和t,表示挖s與挖煤點t由隧道直接連線。

輸入資料以 0 結尾。

輸入檔案中有多少組資料,輸出檔案 output.txt 中就有多少行。

每行對應一組輸入資料的結果。

其中第 i 行以 case i: 開始(注意大小寫,case 與 i 之間有空格,i 與:之間無空格,: 之後有空格),其後是用空格隔開的兩個正整數,

第乙個正整數表示對於第 i 組輸入資料至少需 要設定幾個救援出口,

第二個正整數表示對於第 i 組輸入資料不同最少救援出口的設定方案總數。

輸入資料保證答案小於 2^64。輸出格式參照以下輸入輸出樣例。

91 3

4 1

3 5

1 2

2 6

1 5

6 3

1 6

3 2

61 2

1 3

2 4

2 5

3 6

3 7

0case 1: 2 4

case 2: 4 1

對於任何乙個聯通塊,如果坍塌的是乙個聯通塊中的割點的話,那麼分割成的每個小聯通塊中必須保證各有乙個出口。

我們考慮所有的割點將原圖分割成若干個小聯通塊接下來分類討論:

(1)小塊不與任何乙個割點相連,那我們需要在這裡設立兩個出口,以保證任何乙個出口坍塌後,還有乙個出口可用。

(2)小塊只與乙個割點相連,那麼我們只需要設立乙個即可,出口沒坍塌或割點坍塌了就直接用,如果出口坍塌了,那則可以通過沒坍塌的割點去另乙個小塊的出口。

(3)小塊與超過乙個割點相連,也就意味著,無論小塊中的那個點塌了,都可以通過其他的點到另乙個小塊的出口。

#include#define ll long long

using namespace std;

struct egde e[100005];

int head[505], cut=0, t=0;

int vis[505];

struct edgescc

void addedge(int x, int y) ;

head[x]=cut++;

}void ta(int u, int fa, int q)

if(!dfn[to])

if(pre[u]!=-1&&low[to]>=dfn[u]&&!vis[u])

}else}}

} sc;

int sz=0, siz=0;

unordered_mapmp;

void get(int u)

if(vis[to]==0)

}}int main()

ll ans1=0, ans2=1;

for(int i=1; i<=n; i++)

}for(int i=1; i<=n; i++)

else

}if(sz==1)}}

printf("case %d: %lld %lld\n", cas++, ans1, ans2);

}return 0;

}

HNOI2012 礦場搭建

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

HNOI2012 礦場搭建

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

HNOI2012 礦場搭建

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