題目鏈結
求一棵仙人掌的最大獨立集。
如果是樹,那麼 \(f[i][0/1]\) 表示當前點不取/取的最大獨立集大小,直接dp即可,即 \(f[x][0]+=max(f[v][0],f[v][1])\ ,\ \ f[x][1]+=f[v][0]\)。
對於環,列舉環的根選不選(bzoj1040 騎士),單獨在上面做個dp即可。
也可以tarjan+vector,以及建圓方樹來方便環的轉移(改一下方點f的定義使圓點可以直接轉移即可)。
竟然1a啦,這麼簡單嗎
//4704kb 168ms
#include #include #include //#define gc() getchar()
#define maxin 100000
#define gc() (ss==tt&&(tt=(ss=in)+fread(in,1,maxin,stdin),ss==tt)?eof:*ss++)
const int n=5e4+5,m=120010;
int n,m,enum,h[n],nxt[m],to[m],index,dfn[n],low[n],fa[n],f[n][2],tmp[n][2];
char in[maxin],*ss=in,*tt=in;
inline int read()
inline void addedge(int u,int v)
void dp(int u,int v)
void tarjan(int x)
for(int i=h[x]; i; i=nxt[i])
if(fa[to[i]]!=x&&dfn[to[i]]>dfn[x]) dp(x,to[i]);
}int main()
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...