描述
煤礦工地可以看成是由隧道連線挖煤點組成的無向圖。為安全起見,希望在工地發生事故時所有挖煤點的工人都能有一條出路逃到救援出口處。於是礦主決定在某些挖煤點設立救援出口,使得無論哪乙個挖煤點坍塌之後,其他挖煤點的工人都有一條道路通向救援出口。
請寫乙個程式,用來計算至少需要設定幾個救援出口,以及不同最少救援出口的設定方案總數。
輸入輸入檔案有若干組資料,每組資料的第一行是乙個正整數 n(n<=500),表示工地的隧道數,接下來的 n 行每行是用空格隔開的兩個整數 s 和 t,表示挖 s 與挖煤點 t 由隧道直接連線。輸入資料以 0 結尾。
輸出輸入檔案中有多少組資料,輸出檔案 output.txt 中就有多少行。每行對應一組輸入資料的 結果。其中第 i 行以 case i: 開始(注意大小寫,case 與 i 之間有空格,i 與:之間無空格,: 之後有空格),其後是用空格隔開的兩個正整數,第乙個正整數表示對於第 i 組輸入資料至少需 要設定幾個救援出口,第二個正整數表示對於第 i 組輸入資料不同最少救援出口的設定方案總 數。輸入資料保證答案小於 2^64。輸出格式參照以下輸入輸出樣例。
樣例輸入
91 3
4 13 5
1 22 6
1 56 3
1 63 2
61 2
1 32 4
2 53 6
3 70
樣例輸出
case 1: 2 4
case 2: 4 1
提示case 1 的四組解分別是(2,4),(3,4),(4,5),(4,6);
case 2 的一組解為(4,5,6,7)。
分析:先開始看到這個題想到的是縮點,因為第乙個樣例很具有這方面的暗示性,後來發現這是與割點有關而不是割橋,所以並不適用。
將此題抽象為數學模型就是,要讓每個點滿足對於一些特定的點聯通。
將割點求出後,刪除割點,得到了若干個連通塊。,dfs求出連通塊所連的割點數量。對於每個連通塊,只要被2個割點(或2個以上)連線過,就不用管了。
因為乙個割點炸了,將它與圖的其他部分分開後,還可以從另乙個割點通過。所以其實對於每個連通塊需要兩個割點。
對於沒有割點的連通塊,選任意兩個點建立,組合求出種數,對於只有乙個割點的,只需隨意選乙個建即可。
當然,對於不是割點的點炸了也無所謂(只要不是乙個單的點。但是貌似測試資料裡面也沒有這種情況),因為總有道路可以逃離這一塊
#includeusingnamespace
std;
#define n 10001
int n,m,cnt,cot,tot,group_num,cut,root,num=0
;long
long
ans1,ans2;
intfirst[n],dfn[n],low[n],flag[n],vis[n];
struct
e[n*10
];void add(int u,int
v)void
init()
void tarjan(int u,int
fa)
else
if(v!=fa)
low[u]=min(low[u],dfn[v]);
if(u==root&&son==1
) flag[u]=0
; }
}void dfs(int
u)
if(!vis[v])
dfs(v);
}} void calculate(int
cut)
if(cut==1
)
return
;
}int
main()
for(int i=1;i<=n;i++)
}for(int i=1;i<=n;i++)
}printf(
"case %d: %lld %lld\n
",num,ans1,ans2);
}return0;
}
HNOI2012 礦場搭建
題目鏈結 演算法 對於任何乙個聯通塊,如果坍塌的是乙個聯通塊中的割點的話,那麼分割成的兩個小聯通塊中必須保證各有乙個出口。我們考慮所有的割點將原圖分割成若干個小聯通塊接下來分類討論 1 小塊不與任何乙個割點相連,那我們需要在這裡設立兩個出口,以保證任何乙個出口坍塌後,還有乙個出口可用。2 小塊只與乙...
HNOI2012 礦場搭建
顯然需要求一下點雙 然後列舉每乙個點雙,考慮進行分類討論 如果這乙個聯通塊裡面只有這乙個點雙,也就是這個點雙裡面沒有割點,那麼我們至少需要建造兩個出口,才能保證能跑出去 因為有可能選的那個塌了 如果這個點雙裡面有乙個割點,那麼有兩種情況,一種是割點塌了,這樣我們需要選出1個點,或者割點沒塌,這樣我們...
HNOI2012 礦場搭建
其實是劉汝佳藍書上面的例題啦,wf2011的乙個題 首先我們可以發現,把割頂塗上是不優的。因為刪掉它之後,因此被和原圖斷掉的那一部分就沒有黑點了,它對不連通的分量產生不了任何貢獻。所以我們要先預處理出來點雙聯通分量的割頂,不塗割頂。其次,對於乙個雙聯通分量來講,我們到底要塗幾個呢?其實乙個就夠了,因...