DTOJ 5089 沙漠點列

2021-10-25 08:50:35 字數 1539 閱讀 7596

我們稱一張無向圖是仙人掌,當且僅當這張無向圖連通且每條邊最多屬於乙個簡單環。我們稱一張無向圖是沙漠,當且僅當這張無向圖中所有連通子圖都是仙人掌。

給出乙個 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 以上的時候,預設下一發一定暴擊。當一次觸發了暴...