ZJOI2008 騎士 基環樹

2022-07-16 12:45:13 字數 956 閱讀 4257

題意見鏈結。。。

本題較為經典,值得一做。基環外向樹練手好題。

如果不考慮環的情況,則就是普通樹形dp,f[i][0/1] 表示這個點取或不取。

對於此題一棵樹只能出現乙個環,我們任意刪去環上的一條邊,即可轉環為樹。

對於 (u,v)

1:u 不取,則以 u 為根dp。

2:v 不取,則以 v 為根dp。

不需要考慮兩個點的分別情況,dp的時候考慮在內。

判環我用並查集。

貼**:

1 #include2

#define ll long long

3using

namespace

std;

4int

n,m,cnt;

5const

int n=1000005;6

int fa[n],to[n<<1],nxt[n<<1

],hea[n],ra[n],rb[n];

7ll f[n],g[n],v[n],ans;

8 inline int getf(intx)9

12 inline void dfs(int x,int

fat)

1323

}24 inline void add(int x,int

y)25

28int

main()

2942

else ra[++m]=i,rb[m]=b;43}

44ll t;

45for (int i=1; i<=m; ++i)

4651 printf("

%lld\n

",ans);

52return0;

53 }

view code

fighting fighting fighting

ZJOI2008 騎士(基環樹 DP)

看似有向邊,其實可以轉化為無向邊。構成乙個基環森林 但是需要特判一種情況 當有兩個人互相討厭的時候,形成一棵樹,同時有重邊 我的找環做法需要sort判重,可能有更好的方法 然後把森林裡的每一棵樹或者基環樹dp一下 就是沒有上司的舞會模型,超水 把答案加起來 注意會爆int 做完了 include i...

ZJOI2008 騎士 題解

題面 這道題稍微想一想就會聯想到樹形dp的入門題 沒有上司的舞會 但是再想一想會發現這根本就不是一顆樹,因為它比樹多了一條邊 這時候我們引入乙個新的概念 基環樹 顧名思義 基環樹就是在一顆樹上填一條邊構成的乙個圖 基環樹也叫環套樹 明明更像樹套環 我們在樹上可以做的事情基本都可以在基環樹上實現 比如...

P2607 ZJOI2008 騎士(基環樹)

邊數等於點數,是基環樹。考慮dp,如果是樹的話,轉移方程為dp u 1 選擇u w u dp v 0 v為u的子節點 dp u 0 不選擇u max dp v 0 dp v 1 然後基環樹只要找到環後,斷開環上的一條邊就成了樹。斷開的邊上兩端點不能同時選擇,所以對於每棵基環樹,我們求兩邊dp,分別限...