我們稱一張無向圖是仙人掌,當且僅當這張無向圖連通且每條邊最多屬於乙個簡單環。我們稱一張無向圖是沙漠,當且僅當這張無向圖中所有連通子圖都是仙人掌。
給出乙個 n個點,m 條邊的沙漠,你可以刪去其中的 k 條邊。求能分成的連通塊數量最大值。
3 ≤n
≤106
,0≤k
≤m≤2
×106
,1≤u
,v≤n
3 \leq n \leq 10^6,0 \leq k \leq m \leq 2 \times10^6,1 \leq u,v \leq n
3≤n≤10
6,0≤
k≤m≤
2×10
6,1≤
u,v≤
n 顯然,由於沙漠的性質,一條邊最多屬於一條環。
整個圖上的邊就分為了兩種:
1.
1.1.
環上的邊
2.
2.2.
非環上的邊
接著我們考慮一下斷邊的情況:
對於環上的邊,如果把它斷開,當前這塊連通塊並不能分為2個聯通塊,因為環斷開就變成鏈了,它還是聯通的。得接著斷才能把它斷成不連通。
對於非環上的邊,如果把它斷開,當前這塊連通塊就變成2個連通塊了。
於是,基於貪心的思想,我們優先選擇斷非環邊(因為只要斷i次就能多i個連通塊)斷完之後,若k仍有剩餘,此時的圖一定是若干個環。
思考一下:當我們如果把乙個長度為n
nn的環斷開了,它就會變成長度為n
nn的鏈,即有n
nn條非環邊。然後就又回到第一種情況。
所以,對於有若干個長度不同的環,我們想要盡可能的通過斷開乙個環,使得它出現的非環邊最大。(斷開乙個環的代價都是1),這樣我們k的消耗就能盡可能的小。
判斷非環邊和環邊用dfs即可,記錄一下時間戳dep
idep_i
depi
(即dfs序),然後判斷對於乙個節點i
ii是否有與j
jj相連,並且0
pj 0 < dep_j 0pj然後回溯回去即可。#includeusing namespace std;
const int n=1e6+10;
inline int read()
while(ch>='0'&&ch<='9')k=k*10+ch-'0',ch=getchar();
return k*f;
}int n,m,k;
int tot_=1,ver[n*4],fst[n],nxt[n*4],v[n];
int huan[n],d[n],tot,ans,ans_1;
inline void add(int x,int y)
void dfs(int x,int fa,int dep)
ans+=huan[i]-1;
k-=huan[i];
} printf("%d\n",ans+ans_1);
return 0;
}
lintcode練習 508 擺動排序
給你乙個沒有排序的陣列,請將原陣列就地重新排列滿足如下性質 nums 0 nums 1 nums 2 nums 3 請就地排序陣列,也就是不需要額外陣列 您在真實的面試中是否遇到過這個題?是 給出陣列為 nums 3,5,2,1,6,4 一種輸出方案為 1,6,2,5,3,4 實現 class so...
DTOJ 4019 白玉樓前
白玉樓前 題目背景 一覺醒來怎麼半靈又不見了?一定是幽幽子吃了。幽幽子你給我吐出來!我這邊有個遊戲玩不過去,你幫我玩過去我就吐出來。題目描述 妖夢現在要玩幽幽子的遊戲,她才能拿回自己的半靈。遊戲規則是這樣的 幽幽子有n nn 個點,現在她讓妖夢對每個點隨機一條出邊 隨機到每個點的概率都相等 然後得到...
DTOJ5057 英雄聯盟
小 l 和小 c 在玩 wild rift。眾所周知,wild rift 中的暴擊是非常不靠譜的。他會在一開始設定乙個引數 x 如果第一刀不暴,則第二刀的暴率增加到初始值的 2 倍 如果還是不暴,就繼續增加到初始值的 3 倍,以此類推,當疊加到 100 以上的時候,預設下一發一定暴擊。當一次觸發了暴...