HNOI2012 礦場搭建

2022-03-03 15:27:25 字數 1253 閱讀 2075

其實是劉汝佳藍書上面的例題啦,wf2011的乙個題

首先我們可以發現,把割頂塗上是不優的。因為刪掉它之後,因此被和原圖斷掉的那一部分就沒有黑點了,它對不連通的分量產生不了任何貢獻。

所以我們要先預處理出來點雙聯通分量的割頂,不塗割頂。

其次,對於乙個雙聯通分量來講,我們到底要塗幾個呢?其實乙個就夠了,因為雙聯通分量內部沒有割頂(強調一下,是對於它自己,內部無割頂!可能還是有原圖的割頂存在的)。

但是如果那個雙聯通分量裡面有多於乙個的原圖的割頂,那麼就不需要塗了。因為每次至多只刪去乙個點,所以對於這個雙聯通分量來講,它一定還是會與外界聯通的,所以不需要內部有黑點。

統計方案的話,就是對於每個只有乙個割頂的點雙聯通分量,任意選取乙個不是原圖割頂的點塗黑即可。

最後考慮一種特殊情況,就是整張圖是乙個強連通分量。這樣的話乙個割頂都沒有。這個時候需要塗兩個點。

**如下:

#include#include#include#include#include#include#include#include#include#define maxn 400010

using namespace std;

int n,m,cnt,tot,t,kase;

int dfn[maxn],iscut[maxn],head[maxn<<1],id[maxn];

struct edgeedge[maxn<<1];

struct lineline[maxn<<1];

stacks;

vectorbcc[maxn];

mapex;

inline void add(int from,int to)

inline int tarjan(int x,int fa)

; if(!dfn[v])}}

else if(dfn[v]::iterator it=ex.begin();it!=ex.end();it++)

if(!dfn[it->first])

tarjan(it->first,-1);

long long ans1=0,ans2=1;

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

}if(cnt==1)

ans1=2,ans2=1ll*bcc[1].size()*(bcc[1].size()-1)/2;

printf("case %d: %lld %lld\n",++kase,ans1,ans2);

}return 0;

}

HNOI2012 礦場搭建

題目鏈結 演算法 對於任何乙個聯通塊,如果坍塌的是乙個聯通塊中的割點的話,那麼分割成的兩個小聯通塊中必須保證各有乙個出口。我們考慮所有的割點將原圖分割成若干個小聯通塊接下來分類討論 1 小塊不與任何乙個割點相連,那我們需要在這裡設立兩個出口,以保證任何乙個出口坍塌後,還有乙個出口可用。2 小塊只與乙...

HNOI2012 礦場搭建

顯然需要求一下點雙 然後列舉每乙個點雙,考慮進行分類討論 如果這乙個聯通塊裡面只有這乙個點雙,也就是這個點雙裡面沒有割點,那麼我們至少需要建造兩個出口,才能保證能跑出去 因為有可能選的那個塌了 如果這個點雙裡面有乙個割點,那麼有兩種情況,一種是割點塌了,這樣我們需要選出1個點,或者割點沒塌,這樣我們...

HNOI2012 礦場搭建

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