BZOJ 2730 HNOI2012 礦場搭建

2021-08-09 07:05:25 字數 2249 閱讀 5748

time limit: 10 sec memory limit: 128 mb

submit: 2340 solved: 1086

[submit][status][discuss]

煤礦工地可以看成是由隧道連線挖煤點組成的無向圖。為安全起見,希望在工地發生事故時所有挖煤點的工人都能有一條出路逃到救援出口處。於是礦主決定在某些挖煤點設立救援出口,使得無論哪乙個挖煤點坍塌之後,其他挖煤點的工人都有一條道路通向救援出口。請寫乙個程式,用來計算至少需要設定幾個救援出口,以及不同最少救援出口的設定方案總數。

輸入檔案有若干組資料,每組資料的第一行是乙個正整數 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 13 5

1 22 6

1 56 3

1 63 2

6 1 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)。

day1

題解:

對於那些不是割點的點,如果它塌了,對答案肯定沒有影響,所以考慮刪掉每個割點。

原圖被分為了若干個聯通塊。是不是對於每個聯通塊都需要再建乙個呢?不然。

(1)如果這個聯通塊只與乙個割點相連,那麼肯定要在塊內再建乙個,方案數為siz,siz代表聯通塊大小。

(2)如果這個聯通塊與兩個及以上的割點相連,那麼即使有乙個割點塌掉,仍然可以從另乙個割點逃生,所以對於與兩個以上割點相連的聯通塊,可以不用再建。

(3)如果這個聯通塊本來就是與其他聯通塊分離,沒有割點與它相連,那麼塊內至少選2個,方案數為c(2,siz)。[其實資料好像沒有這種情況。

如果原圖本身就是乙個點雙聯通分量,沒有割點,就與上述情況的3類似,只需要建2個,方案數為c(2,n)。

當且僅當原圖中只有1個點時,方案數才為1。【但這樣一塌就不滿足都能跑出去了…所以其實不考慮也行。

#include

#include

#include

#define ll long long

using

namespace

std;

inline

int read()

while(ch>='0'&&ch<='9')

return x*f;

}const

int n = 500 + 10;

int n,m;

struct nodee[n<<1];

int head[n],num=0;

void addedge(int from,int to)

int indx=0,low[n],dfn[n];

int tot=0,iscut[n];

void tarjan(int u,int f)

else low[u]=min(low[u],dfn[v]);

}if(son==1&&f==0)

}int vis[n],cnt=0,siz;

int cutnum=0;

void dfs(int u)

if(!vis[v]) dfs(v);

}}int ti=0;

#define ms(x,y) memset(x,y,sizeof(x))

void update()

int main()

for(int i=1;i<=n;++i)

if(tot==0)

ll ans1=0,ans2=1;

for(int i=1;i<=n;++i)

}printf("case %d: %lld ",++ti,ans1);

printf("%lld\n",ans2);

}return

0;}

bzoj 2730 HNOI2012 礦場搭建

description 煤礦工地可以看成是由隧道連線挖煤點組成的無向圖。為安全起見,希望在工地發生事故時所有挖煤點的工人都能有一條出路逃到救援出口處。於是礦主決定在某些挖煤點設立救援出口,使得無論哪乙個挖煤點坍塌之後,其他挖煤點的工人都有一條道路通向救援出口。請寫乙個程式,用來計算至少需要設定幾個救...

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...