description
煤礦工地可以看成是由隧道連線挖煤點組成的無向圖。為安全起見,希望在工地發生事故時所有挖煤點的工人都能有一條出路逃到救援出口處。於是礦主決定在某些挖煤點設立救援出口,使得無論哪乙個挖煤點坍塌之後,其他挖煤點的工人都有一條道路通向救援出口。請寫乙個程式,用來計算至少需要設定幾個救援出口,以及不同最少救援出口的設定方案總數。
input
輸入檔案有若干組資料,每組資料的第一行是乙個正整數 n(n≤500),表示工地的隧道數,接下來的 n 行每行是用空格隔開的兩個整數 s 和 t,表示挖 s 與挖煤點 t 由隧道直接連線。輸入資料以 0 結尾。
output
輸入檔案中有多少組資料,輸出檔案 output.txt 中就有多少行。每行對應一組輸入資料的 結果。其中第 i 行以 case i: 開始(注意大小寫,case 與 i 之間有空格,i 與:之間無空格,: 之後有空格),其後是用空格隔開的兩個正整數,第乙個正整數表示對於第 i 組輸入資料至少需 要設定幾個救援出口,第二個正整數表示對於第 i 組輸入資料不同最少救援出口的設定方案總 數。輸入資料保證答案小於 2^64。輸出格式參照以下輸入輸出樣例。
sample input
9 1 3
4 13 5
1 22 6
1 56 3
1 63 2
6 1 2
1 32 4
2 53 6
3 70
sample output
case 1: 2 4
case 2: 4 1
看到這題 是 割點 就開始想 怎麼tarjan
當然 如果沒有割點的話,只要放2個就好了!那就是c(n,2)
然後 發現 割點 會把圖 分成 許多連通塊。
我們統計 每一塊 連通塊。
如果 乙個連通塊 的割點數量是2以上 那就不管,如果只有乙個,就需要王連通塊裡放乙個。答案需要用乘法原理嘍。
所以 重點在 割點 怎麼求吧 也就是 分成根節點和不是根節點 的
如果根節點 的 兒子》=1 是,如果別的點就是大於等於1
還有連通塊 一遍dfs就ok?
#include
#include
#include
#define maxn 10005
#define int long long
using
namespace
std;
//by mars_ch
int n,m;
struct data
e[100005];
int cases;
int first[505],tot;
int ans,num;
int dfn[maxn],low[maxn],cut[maxn],tim,instack[maxn],vis[maxn],used[maxn];
int tot1,tot2;
bool flag;
void add(int a,int b)
void tarjan(int x,int rt)
else
}if((cnt == 1 && x!=rt) || cnt>1 ) cut[x]=1,flag=true;;
}void dfs(int x)
}signed main()
for(int i=1;i<=n;i++)
}printf("case %lld: ",++cases);
if(!flag)
else
if(tot1 == 1)}}
printf("%lld %lld\n",num,ans);}}
return
0;}
BZOJ 2730 HNOI2012 礦場搭建
time limit 10 sec memory limit 128 mb submit 2340 solved 1086 submit status discuss 煤礦工地可以看成是由隧道連線挖煤點組成的無向圖。為安全起見,希望在工地發生事故時所有挖煤點的工人都能有一條出路逃到救援出口處。於是礦...
BZOJ2730 HNOI2012 礦場搭建
題解 一道水題交了5次才過 只需考慮刪去的點是割點的情況。刪去所有割點,形成若干聯通塊,假如圖中只有乙個聯通塊,則需設定兩個出口。若乙個聯通塊可以到達兩個割點,則該聯通塊內不必設定出口,否則必須設定出口。方案數利用乘法原理計算即可。一定要注意細節。co de cod e include includ...
bzoj2730 HNOI2012 礦場搭建
容易看出是雙聯通。and then?割點!終於有題證明了low x min low x dfn y 不能改成low y 了 然後不會做 對強聯通理解不夠深刻 先把每個聯通塊割點數弄出來,再找一次每個聯通塊 include include include include include include...