UOJ67 新年的毒瘤 Tarjan,割點

2022-06-03 06:45:12 字數 2018 閱讀 1320

online judge:#uoj 67

label:tarjan,割點,細節

辭舊迎新之際,喜羊羊正在打理羊村的綠化帶,然後他發現了一棵長著毒瘤的樹。這個長著毒瘤的樹可以用\(n\)個結點\(m\)條無向邊的無向圖表示。這個圖中有一些結點被稱作是毒瘤結點,即刪掉這個結點和與之相鄰的邊之後,這個圖會變為一棵樹。樹也即無簡單環的無向連通圖。

現在給你這個無向圖,喜羊羊請你幫他求出所有毒瘤結點。

第一行兩個正整數\(n,m\),表示有\(n\)個點\(m\)條邊。保證\(n≥2\)。

接下來\(m\)行,每行兩個整數 \(v,u\),表示\(v\)和\(u\)之間有一條無向邊。\(1≤v,u≤n\)。保證沒有重邊和自環

第一行乙個正整數\(n_s\),表示這個圖中有\(n_s\)個結點是毒瘤。

接下來一行,共\(ns\)個整數,每個整數表示乙個毒瘤結點的編號。請按編號從小到大的順序輸出。

資料保證圖中至少存在乙個毒瘤結點

input#1

6 6

1 21 3

2 42 5

4 65 6

output#1

3

4 5 6

hint

對於40%資料,\(n,m<=1000\);

另存在10%資料,\(m=n-1\);

另存在20%資料,\(m=n\);

對於100%資料,\(n,m<=10^5\)。

刪掉毒瘤後,變成一棵樹。所以這個毒瘤顯然不能是割點,刪去乙個毒瘤,剩下\(n-1\)個點,既然是一棵樹,也就是說還剩\(n-2\)條邊,那麼還需滿足乙個條件,毒瘤的度為\(m-(n-2)=m-n+2\)

這道題就變成了裸的tarjan求割點板子+特判,割點板子在此:)。

1.對於根節點,只需滿足它的兒子數》=2,它就是割點。

2.對於非根節點x,只需他存在乙個兒子y滿足\(low[y]>=dfn[x]\),x就是割點。

但這題還有幾個毒瘤細節。題目說了,資料保證至少存在乙個毒瘤,所以大致可以知道資料形成的圖是什麼樣子,顯然,存在的聯通塊數量<=2。而且當聯通塊數量為2時,有乙個聯通塊只包含乙個點,並且此時\(m=n-2\),按理說這種情況應該特判一下的(答案就是唯一的那個點),但好像不去判也沒關係,就不管它了。剩下的情況都是乙個聯通塊的,所以直接tarjan(1,0)就好了,不用掃一遍for(i=1~n)if(!dfn[i])tarjan(i,0)這樣了。

**如下:

#includeusing namespace std;

const int n=1e5+10;

inline int read()

struct edgee[n<<1];

int n,m,ing[n],dfn[n],low[n],ge[n];

int ecnt,head[n];

inline void link(int u,int v)

int tot,rootson;

vectorans;

void tarjan(int x,int fa)

else

} if(fa==0&&rootson>=2)ge[x]=1;

}int main()

tarjan(1,0);

for(int i=1;i<=n;i++)if(ing[i]==m-n+2&&!ge[i])ans.push_back(i);

printf("%d\n",ans.size());

for(int i=0;i}

UOJ67 新年的毒瘤

作者部落格 解題報告 考慮能變成一棵樹,肯定說明至少選擇的點不是割點,其次題解裡面說了這個點的度數有特定的要求.那麼就變成簡單題了.只需找出不是割點且度數 m n 2 的點即可。注意有一些奇怪的邊界條件.不要想當然的以為m n 1答案是0.it is made by ljh2000 include ...

UOJ 67 新年的毒瘤 Tarjan

uoj 一棵 n 個節點的樹顯然有 n 1 條邊,在本題中意味著刪去乙個點之後還剩下 n 2 條邊。那麼找到所有度數為 m n 2 的點就好了。但是因為是一棵樹,所以聯通,所以割點不是答案。include includeusing namespace std define ll long long ...

uoj 176 新年的繁榮

給出乙個完全圖,邊權為兩點權值的and,求最大生成樹。這題用最小生成樹的boruvka演算法。大概就是每次找到每乙個聯通塊權值最大的邊,將這些聯通塊合併,直到只剩乙個聯通塊。因為每次聯通塊的個數至少減半,所以只會做log次操作。那麼這題相當於每個點有不同顏色,要找到每個點的異色點中最大的and值。扔...