時間限制: 1 s
空間限制: 256000 kb
題目等級 : 大師 master
題解煤礦工地可以看成是由隧道連線挖煤點組成的無向圖。為安全起見,希望在工地發生事故時所有挖煤點的工人都能有一條出路逃到救援出口處。於是礦主決定在某些挖煤點設立救援出口,使得無論哪乙個挖煤點坍塌之後,其他挖煤點的工人都有一條道路通向救援出口。
請寫乙個程式,用來計算至少需要設定幾個救援出口,以及不同最少救援出口的設定方案總數。
輸入描述 input description
輸入檔案有若干組資料,每組資料的第一行是乙個正整數n(n≤500),表示工地的隧道數,接下來的n 行每行是用空格隔開的兩個整數s 和t,表示挖煤點s 與挖煤點t 由隧道直接連線。輸入資料以0 結尾。
輸出描述 output description
輸入檔案中有多少組資料,輸出檔案中就有多少行。每行對應一組輸入資料的結果。其中第i 行以case i: 開始(注意大小寫,case 與i 之間有空格,i 與:之間無空格,:之後有空格),其後是用空格隔開的兩個正整數,第乙個正整數表示對於第i 組輸入資料至少需要設定幾個救援出口,第二個正整數表示對於第i 組輸入資料不同最少救援出口的設定方案總數。輸入資料保證答案小於2^64。輸出格式參照以下輸入輸出樣例。
樣例輸入 sample input
91 3
4 13 5
1 22 6
1 56 3
1 63 2
61 2
1 32 4
2 53 6
3 70
樣例輸出 sample output
case 1: 2 4
case 2: 4 1
資料範圍及提示 data size & hint
case 1 的四組解分別是(2,4),(3,4),(4,5),(4,6);
case 2 的一組解為(4,5,6,7)。
分類標籤 tags 點此展開
題意:
*給定乙個n個點,m條邊的圖。要在這n個點選擇若干點建造避難所,使得無論哪個點**,每個點上的人都能逃到這個避難所去。
*求最少避難所個數,以及在這個前提下的方案總數。
解析:
*求出所有割點後。對於剩下的所有聯通塊都縮成乙個點。
*接下來對於所有點,若該點與兩個點相連,則不需要建立避難所,若只與乙個點相連,則需要建立1個避難所,若沒有相連,則需要建立2個避難所。
*方案總數用乘法原理乘起來就可以了。
ac**:
#include#include#include
#define ll long long
using
namespace
std;
inline
const
intread()
while(ch>='
0'&&ch<='9')
return x*f;
}const
int n=510
;vector
grap[n];
intn,m,cas,pd,dfn[n],low[n],son,ans,sum;
intsiz[n],r[n],matc[n];
bool
f[n],cut[n],mark[n];
ll cnt;
void
cl()
void tarjan(int v,int
root)
else
if(mark[w])
}}void dfs(int
x) }
}int
main()
for(int i=1;i<=n;i++) if(!dfn[i])
for(int i=1;i<=n;i++) if(!cut[i]&&!f[i])
if(sum==1
)
else}}
printf(
"case %d: %d %lld\n
",++cas,ans,cnt);
}return0;
}
HNOI2012 礦場搭建
題目鏈結 演算法 對於任何乙個聯通塊,如果坍塌的是乙個聯通塊中的割點的話,那麼分割成的兩個小聯通塊中必須保證各有乙個出口。我們考慮所有的割點將原圖分割成若干個小聯通塊接下來分類討論 1 小塊不與任何乙個割點相連,那我們需要在這裡設立兩個出口,以保證任何乙個出口坍塌後,還有乙個出口可用。2 小塊只與乙...
HNOI2012 礦場搭建
顯然需要求一下點雙 然後列舉每乙個點雙,考慮進行分類討論 如果這乙個聯通塊裡面只有這乙個點雙,也就是這個點雙裡面沒有割點,那麼我們至少需要建造兩個出口,才能保證能跑出去 因為有可能選的那個塌了 如果這個點雙裡面有乙個割點,那麼有兩種情況,一種是割點塌了,這樣我們需要選出1個點,或者割點沒塌,這樣我們...
HNOI2012 礦場搭建
其實是劉汝佳藍書上面的例題啦,wf2011的乙個題 首先我們可以發現,把割頂塗上是不優的。因為刪掉它之後,因此被和原圖斷掉的那一部分就沒有黑點了,它對不連通的分量產生不了任何貢獻。所以我們要先預處理出來點雙聯通分量的割頂,不塗割頂。其次,對於乙個雙聯通分量來講,我們到底要塗幾個呢?其實乙個就夠了,因...