題目描述
煤礦工地可以看成是由隧道連線挖煤點組成的無向圖。為安全起見,希望在工地發生事故時所有挖煤點的工人都能有一條出路逃到救援出口處。於是礦主決定在某些挖煤點設立救援出口,使得無論哪乙個挖煤點坍塌之後,其他挖煤點的工人都有一條道路通向救援出口。
請寫乙個程式,用來計算至少需要設定幾個救援出口,以及不同最少救援出口的設定方案總數。
輸入輸出格式
輸入格式:
輸入檔案有若干組資料,每組資料的第一行是乙個正整數 n(n<=500),表示工地的隧道數,接下來的 n 行每行是用空格隔開的兩個整數 s 和 t,表示挖 s 與挖煤點 t 由隧道直接連線。輸入資料以 0 結尾。
輸出格式:
輸入檔案中有多少組資料,輸出檔案 output.txt 中就有多少行。每行對應一組輸入資料的 結果。其中第 i 行以 case i: 開始(注意大小寫,case 與 i 之間有空格,i 與:之間無空格,: 之後有空格),其後是用空格隔開的兩個正整數,第乙個正整數表示對於第 i 組輸入資料至少需 要設定幾個救援出口,第二個正整數表示對於第 i 組輸入資料不同最少救援出口的設定方案總 數。輸入資料保證答案小於 2^64。輸出格式參照以下輸入輸出樣例。
輸入輸出樣例
輸入樣例#1: 複製
9 1 3
4 1
3 5
1 2
2 6
1 5
6 3
1 6
3 2
6 1 2
1 3
2 4
2 5
3 6
3 7
0 輸出樣例#1: 複製
case 1: 2 4
case 2: 4 1
說明case 1 的四組解分別是(2,4),(3,4),(4,5),(4,6);
case 2 的一組解為(4,5,6,7)。
分類討論,如果聯通塊內部無割點,則在聯通塊內任選兩個點作為出口。
如果聯通塊內有乙個割點,則在聯通塊內選乙個點作為出口。
如果割點大於等於兩個,則可與其他聯通,不需要出口。
#include
#include
#include
using
namespace
std;
const
int maxn = 505;
struct edge edge[maxn*maxn];
int n,m,tot,num,cnt,countt,group,num;
int dfn[maxn],low[maxn],head[maxn],cut,vis[maxn];
long
long sum=1;
bool cut[maxn];
inline
void add(int bg,int ed)
inline
void tarjan(int u,int fa)
low[u]=min(low[u],dfn[v]);
if(child>=2 && u==fa)
cut[u]=1;
}}inline
void dfs(int u)
if(!vis[v])
dfs(v);
}}int main()
tarjan(1,1);
for(register
int i=1;i<=n;i++)
if(cut==1)}}
printf("case %d: %d %lld\n",countt,tot,sum);
}}
HNOI2012 礦場搭建
題目鏈結 演算法 對於任何乙個聯通塊,如果坍塌的是乙個聯通塊中的割點的話,那麼分割成的兩個小聯通塊中必須保證各有乙個出口。我們考慮所有的割點將原圖分割成若干個小聯通塊接下來分類討論 1 小塊不與任何乙個割點相連,那我們需要在這裡設立兩個出口,以保證任何乙個出口坍塌後,還有乙個出口可用。2 小塊只與乙...
HNOI2012 礦場搭建
顯然需要求一下點雙 然後列舉每乙個點雙,考慮進行分類討論 如果這乙個聯通塊裡面只有這乙個點雙,也就是這個點雙裡面沒有割點,那麼我們至少需要建造兩個出口,才能保證能跑出去 因為有可能選的那個塌了 如果這個點雙裡面有乙個割點,那麼有兩種情況,一種是割點塌了,這樣我們需要選出1個點,或者割點沒塌,這樣我們...
HNOI2012 礦場搭建
其實是劉汝佳藍書上面的例題啦,wf2011的乙個題 首先我們可以發現,把割頂塗上是不優的。因為刪掉它之後,因此被和原圖斷掉的那一部分就沒有黑點了,它對不連通的分量產生不了任何貢獻。所以我們要先預處理出來點雙聯通分量的割頂,不塗割頂。其次,對於乙個雙聯通分量來講,我們到底要塗幾個呢?其實乙個就夠了,因...