NOIP模擬 10 24 T1 建設樹

2021-08-09 18:20:30 字數 1769 閱讀 9618

題目描述:

一棵樹已經聯通,問再加入多少條邊,能滿足去掉一條邊,任意兩個點還是可以互相到達。

所有的道路是雙向的。

輸入格式:

第一行乙個整數n,m代表點數和初始邊數。

接下來n行,每行2個數字f和t,表示f和t之間有一條無向邊連線。

輸出格式:

輸出乙個整數表示最少需要加入的邊數。

樣例範圍:

對於30%的資料:n<=7;

對於另外20%的資料:m=n-1;

對於另外20%的資料:m=n;

對於100%的資料:1<=n<=100000 1<=m<=200000

解析:邊-雙連通分量模板題。

首先,解釋一下什麼是雙連通分量。

雙聯通分量屬於tarjan演算法,分為點-雙連通分量和邊-雙連通分量

點-雙連通圖:乙個連通的無向圖內部沒有割點,那麼該圖是點-雙連通圖。

注意:孤立點,以及兩點一邊這兩種圖都是點-雙連通的。因為它們都是內部無割點。

邊-雙連通圖:乙個連通的無向圖內部沒有橋,那麼該圖就是邊-雙連通的。

注意:孤立點是邊-雙連通的,但是兩點一邊不是邊-雙連通的。

由上面定義可以知道:點-雙連通圖不一定是邊-雙連通的。

邊-雙聯通分量與強連通分量思想類似,值得注意的是邊-強連通分量需要判斷是否有重邊,判斷方法與割邊的方法一樣。

邊-雙連通分量的核心**如下:

inline void tarjan(int point,int e,int fa)

else if(bian[u].to!=fa) low[point]=min(low[point],num[bian[u].to]);}}

if(low[point]==num[point]) //找到乙個雙聯通分量

}}

解析:

對於30%的資料,列舉邊,縮點驗證。

對於另外20%的資料,所加邊數=(葉子數目+1)/2。

對於另外20%的資料,把環縮成乙個點,然後方法同上。

對於100%的點,求出圖中所有雙連通分量,然後對每乙個雙連通分量進行縮點,求出度為1的點的個數,即為葉子節點的個數,所加邊數=(葉子數目+1)/2。

**:

#include using namespace std;

const int max=1000100;

int n,m,s=-1,index,tot,sum; //邊數s從0 開始儲存,有利於判重邊

int low[max],num[max],zhan[max];

int first[max],to[max],father[max];

struct shu;

shu bian[max*2];

inline int get_int()

for(;isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+c-'0';

return x*f;

}void build(int x,int y) //鄰接表

inline void tarjan(int point,int e,int fa) //求雙連通分量

else if(bian[u].to!=fa) low[point]=min(low[point],num[bian[u].to]);}}

if(low[point]==num[point])

}}int main()

tarjan(1,-1,0);

if(sum==1) {cout<<"0"<

NOIP模擬(10 30)T1 比賽

比賽 題目背景 10.30 noip 模擬t1 分析 暴力 將資料從小到大排序,從大到小找到第乙個滿足 a i k a i 1 的位置,那麼答案就是 n i 了,如果找不到那麼就是 n了 注意邊界 source created by scarlyw include include include i...

NOIP模擬 簡單 T1 舉辦比賽

border 0 width 330 height 86 src mstdream 舉辦了一場搶答比賽!這場搶答比賽有 n 支隊伍參賽,第 i 支隊伍將會被分配乙個隨機值 si,每乙個問題,si 值較小的隊伍會擁有優先發言權,於是 mstdream 想知道所有隊伍最小的 si 值,以便統計 但是,由...

NOIP模擬 三 T1 太空電梯

border 0 width 330 height 86 src 為了解決日漸增長的人口問題,mstdream 率領乙個小組到達火星開發新的居住地。地球到火星有一架太空電梯,電梯一次最多承載 2 個人,最大載重為 k,小組一共有 n 個人,第 i 個人重量為 vi 人們排成一隊等候上電梯。上電梯的規...