煤礦工地可以看成是由隧道連線挖煤點組成的無向圖。為安全起見,希望在工地發生事故時所有挖煤點的工人都能有一條出路逃到救援出口處。於是礦主決定在某些挖煤點設立救援出口,使得無論哪乙個挖煤點坍塌之後,其他挖煤點的工人都有一條道路通向救援出口。請寫乙個程式,用來計算至少需要設定幾個救援出口,以及不同最少救援出口的設定方案總數。
輸入檔案有若干組資料,每組資料的第一行是乙個正整數 n(n≤500),表示工地的隧道數,接下來的 n 行每行是用空格隔開的兩個整數 s 和 t,表示挖 s 與挖煤點 t 由隧道直接連線。輸入資料以 0 結尾。
輸入檔案中有多少組資料,輸出檔案output.txt 中就有多少行。每行對應一組輸入資料的 結果。其中第i 行以case i: 開始(注意大小寫,case 與i 之間有空格,i 與:之間無空格,: 之後有空格),其後是用空格隔開的兩個正整數,第乙個正整數表示對於第i 組輸入資料至少需 要設定幾個救援出口,第二個正整數表示對於第i 組輸入資料不同最少救援出口的設定方案總數。輸入資料保證答案小於2^64。輸出格式參照以下輸入輸出樣例。
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 case 1: 2 4
case 2: 4 1
case 1 的四組解分別是(2,4),(3,4),(4,5),(4,6);
case 2 的一組解為(4,5,6,7)。
1.這道題牽涉到我們省選以前很少用過的東西——雙連通分量。
這題就和點雙連通有關,回顧一下點雙連通。
定義:在乙個點雙連通圖中,任意連個不同的點都至少有兩條不經過同乙個點的路徑將它們相連。
從定義中我們可以看出,在乙個點雙連通圖中,去掉任意乙個點,其它的點都是聯通的。也就是說,對於乙個點雙連通圖,我們要建兩個出口,那麼即使乙個出口坍塌,我們還可以從另外乙個出口出去。
2.這只是乙個很籠統的想法,因為題目所給的圖不一定是點雙連通圖。但是可以肯定的是,任何乙個圖都是由很多個點雙連通組成的,而且點雙連通兩兩之間都是用割點鏈結起來的(如果是橋,那麼就是兩個割點),也就是說我們可以把所給的圖拆分成很多個點雙連通。
zero 當和0個割點相連時,如上文所說,要建兩個出口。
one 當和1個割點相連時,要建1個出口,若果割點炸了,那麼還可以從這個出口出去。
two or more 當和2個或兩個以上個割點相連時,不需要建出口,因為乙個割點炸了,還可以從另外乙個割點到達別的點雙聯通分量。
4.對於題目第二問求方案數,直接用乘法原理就可以了。這一問很簡單,自己yy一下就好。
1//never forget why you start
2 #include3 #include4 #include5 #include6 #include7 #include8
using
namespace
std;
9 typedef long
long
lol;
10int
n,m,t,ans;
11lol ans2;
12struct
node edge[1005
];15
int head[505],size=0;16
void putin(int
from,int
to)
22void
clean();
23int dfn[505],low[505],iscut[505
],dfscnt,root,child;
24void tarjan(int r,int
fa)
36 } else
if(y!=fa)low[r]=min(low[r],dfn[y]);37}
38 }//
tarjan求割點
39int cnt,vis[505
],num,sum;
40void dfs(int
r) else
if(vis[y]!=cnt)dfs(y);50}
51 }//
遍歷每個點雙連通分量,sum表示和這個點雙聯通分量相連的割點的個數
52int
main()
66for(i=1; i<=n; i++) 73}
74for(i=1; i<=n; i++)
84if(sum==1
) 88}89
}90 printf("
case %d: %d %lld\n
",t,ans,ans2);91}
92return0;
93}94void
clean() //
各種初始化
HNOI2012 礦場搭建
題目鏈結 演算法 對於任何乙個聯通塊,如果坍塌的是乙個聯通塊中的割點的話,那麼分割成的兩個小聯通塊中必須保證各有乙個出口。我們考慮所有的割點將原圖分割成若干個小聯通塊接下來分類討論 1 小塊不與任何乙個割點相連,那我們需要在這裡設立兩個出口,以保證任何乙個出口坍塌後,還有乙個出口可用。2 小塊只與乙...
HNOI2012 礦場搭建
顯然需要求一下點雙 然後列舉每乙個點雙,考慮進行分類討論 如果這乙個聯通塊裡面只有這乙個點雙,也就是這個點雙裡面沒有割點,那麼我們至少需要建造兩個出口,才能保證能跑出去 因為有可能選的那個塌了 如果這個點雙裡面有乙個割點,那麼有兩種情況,一種是割點塌了,這樣我們需要選出1個點,或者割點沒塌,這樣我們...
HNOI2012 礦場搭建
其實是劉汝佳藍書上面的例題啦,wf2011的乙個題 首先我們可以發現,把割頂塗上是不優的。因為刪掉它之後,因此被和原圖斷掉的那一部分就沒有黑點了,它對不連通的分量產生不了任何貢獻。所以我們要先預處理出來點雙聯通分量的割頂,不塗割頂。其次,對於乙個雙聯通分量來講,我們到底要塗幾個呢?其實乙個就夠了,因...