井下礦工(點雙聯通分量)

2021-08-20 13:02:54 字數 2016 閱讀 4698

【問題描述】

有一座地下的稀有金屬礦由n條隧道和一些連線點組成,其中每條隧道連線兩個點。任意兩個連線點之間最多只有一條隧道。為了降低礦工的危險,你的任務是在一些連線點處安裝太平井和相應的逃生裝置,使得不管那些連線點倒塌,不在次連線點的所有礦工都能到達太平井逃生(假定除了倒塌的連線點不能通行外,其他隧道和連線點完好無損)。為了節約成本,你應該在盡量少的連線點安裝太平井。還需要計算出當太平井的數目和最小時的安裝方案總數。

【輸入格式】

輸入包含多組資料,每組資料第一行為隧道條數n(n<=50000),以下n行每行兩個整數,即一條隧道兩端的連線點編號(所有點從1開始編號)。每組資料的所有連線點保證連通。

【輸出格式】

對於每組資料,輸出兩個整數,即最少需要安裝的太平井數量以及對應的方案總數。方案總數保證在64位帶符號整數範圍內。

【輸入樣例】

91 3

4 13 5

1 22 6

1 56 3

1 63 2

6 1 2

1 32 4

2 53 6

3 7【輸出樣例】

2 44 1

【資料範圍】

n<=50000

每測試點最多不超過10組資料。

1.可以看出這個題基本的要求點雙聯通分量;

2.題目等價於:如果修乙個太平井是塗乙個黑點,那麼刪掉任意乙個點後,每個連通分量至少有乙個黑點;

3.把割頂塗黑是不划算的,因為乙個割頂往往連線多個分量,如果刪了割頂,多個分量都可能沒有黑點;

4.如果乙個連通分量只有乙個割頂,若分量內沒有黑點,而是通過割頂到其他的黑點,那麼刪掉這個割頂後,分量就連不到黑點。所以只有乙個割頂的分量至少要塗乙個,塗非割頂即可;

5.類似,如果乙個分量有多個割頂,刪掉任意乙個總可以通過其他的割頂到達黑點,故不需要塗黑;

6.特殊情況:整個圖沒有割頂,只需要塗兩個點;

7.計數運用乘法原理;

**寫得醜別介意:

#include#include#include#includeusing namespace std;

const int maxn=50005;

int m,np,np2,time=0,last[maxn],last2[maxn];

struct edgee[maxn*2];

struct data;

struct myvectorbcc[maxn*2];//存每個連通分量的點

char c;

void qkscanf(int &x)

void addedge(int u,int v,int id)

; last[u]=np;

}int bcc_cnt;

void push_bcc(int num)

; last2[bcc_cnt]=np2;

}int dfs_clock=0,top=0,stk[maxn+10005],cut[maxn];//說明:陣列用結構體,是為了少用幾次memset,請無視

data dfn[maxn],low[maxn];//dfn時間戳,low能返回的最早的點的時間戳

void dfs(int i,int fd)

; int chd=0;

stk[++top]=i;

for(int p=last[i];p;p=e[p].pre)}}

if(chd==1&&fd==0) cut[i]=0;//應該是很熟悉的結論了

}void init()

int main()

dfs(1,0);//求出連通分量

long long ans1=0,ans2=1;

int sz;

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

//計算第i個連通分量裡有多少個割點

if(cut_cnt==1)//引用結論

}if(bcc_cnt==1)//引用結論

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

return 0;

}

點 邊 雙聯通分量1 1

點 include include include include include includeusing namespace std const int maxn 1000 10 int n,m int bcc cnt int dfs clock bcc cnt計數一共有多少個點 雙連通分量 i...

邊雙聯通分量

首先什麼是邊雙聯通分量?邊雙連通分量是指,在 無向圖 中刪除任意一條邊依舊聯通的聯通塊 之前講過強連通分量,這裡邊雙聯通分量的做法也需要利用tarjan演算法獲得邊雙聯通分量。對於邊雙聯通分量中還有乙個概念,就是橋。橋指的是 刪除該邊圖不再連通。對應的另乙個概念是 割點 割點的的是 如果除去此節點和...

邊雙聯通分量

noip最後一次學習 敲板子 橋 如果這條邊去掉後圖的聯通分量增加,則這條邊稱為橋。邊雙聯通分量 如果乙個對於乙個圖的某個子圖,任意兩點至少存在兩條 邊不重複 的路徑,則這個子圖是邊雙聯通分量。很顯然,任意乙個邊雙中不含有橋。除橋外每條邊都僅屬於乙個邊雙。如果把原圖中所有橋刪除,每個聯通分量都是原圖...