BZOJ 4316 小C的獨立集 解題報告

2022-04-29 23:45:07 字數 1015 閱讀 3415

圖論小王子小c經常虐菜,特別是在圖論方面,經常把小d虐得很慘很慘。

這不,小c讓小d去求乙個無向圖的最大獨立集,通俗地講就是:在無向圖中選出若干個點,這些點互相沒有邊連線,並使取出的點盡量多。

小d雖然圖論很弱,但是也知道無向圖最大獨立集是npc,但是小c很仁慈的給了乙個很有特點的圖: 圖中任何一條邊屬於且僅屬於乙個簡單環,圖中沒有重邊和自環。小c說這樣就會比較水了。

小d覺得這個題目很有趣,就交給你了,相信你一定可以解出來的。

第一行,兩個數\(n\),\(m\),表示圖的點數和邊數。

第\(2\sim m+1\)行,每行兩個數\(x\),\(y\),表示\(x\)與\(y\)之間有一條無向邊。

輸出這個圖的最大獨立集。

\(100\%\)

\(n\le 50000,m\le 60000\)

不用建圓方樹的仙人掌。

最大獨立集:選出最大的點集,使得兩兩沒有邊連線。

對普通樹邊按普通的\(dp\)即可

對環上的點,把環的頭拽出來,然後從它屁股dp上去就行了

code:

#include const int n=6e4+10;

int head[n],to[n<<1],next[n<<1],cnt;

void add(int u,int v)

int min(int x,int y)

const int inf=0x3f3f3f3f;

int n,m,dp[n][2],dfn[n],low[n],dfsclock,fa[n];

void cal(int rt,int now)

dp[rt][0]+=max(s0,s1);

s0=-inf,s1=0,now=t;

while(now!=rt)

dp[rt][1]+=s0;

}void dfs(int now)

int main()

2018.12.24

BZOJ 4316 小C的獨立集

4316 小c的獨立集 思路 先將樹上的轉移做好。然後環上的轉移就是強制最上面的的點選或者不選,然後在環上跑一遍轉移就可以了。pragma gcc optimize 2 pragma gcc optimize 3 pragma gcc optimize 4 includeusing namespac...

bzoj4316 小C的獨立集

圖論小王子小c經常虐菜,特別是在圖論方面,經常把小d虐得很慘很慘。這不,小c讓小d去求乙個無向圖的最大獨立集,通俗地講就是 在無向圖中選出若干個點,這些點互相沒有邊連線,並使取出的點盡量多。小d雖然圖論很弱,但是也知道無向圖最大獨立集是npc,但是小c很仁慈的給了乙個很有特點的圖 圖中任何一條邊屬於...

bzoj 4316 小C的獨立集 樹形dp

仙人掌樹形dp。令f x 0 表示以x為根的子樹中,不選x的最大值 f x 1 表示選x的最大值。注意到,同乙個環中的所有點,只有在dfs樹中最高的那個點才會對所在環之外的點的f值造成影響。因此我們在最高的那個點做乙個dp,然後就得到了最高那個點的f,而這個環中的其他點的f就不用管了。ac 如下 i...