將每個人討厭的人連上一條有向邊,構成了基環樹森林,從每個樹的環上斷一條邊,從兩條邊的點跑兩次dfs,計算一下最大值加到答案裡
還有就是會超int
**
#includeusing namespace std;
const int maxn=2e6+5;
const long long inf=1e17;
int n,root,cnt,v[maxn],fa[maxn],vis[maxn],head[maxn];
long long f[maxn][2];
struct edge
e[maxn];
void add(int x,int y)
long long ans;
void dfs(int x)
dfs(to);
f[x][0]+=max(f[to][0],f[to][1]);
f[x][1]+=f[to][0]; }}
void circle(int x)
dfs(root);
long long ans1=max(f[root][0],f[root][1]);
vis[root]=1;
root=fa[root];
dfs(root);
long long ans2=max(f[root][0],f[root][1]);
ans+=max(ans1,ans2);
}int main()
for(int i=1;i<=n;i++)
if(!vis[i])
circle(i);
printf("%lld",ans);
return 0;
}
P2607(基環樹 樹形DP)
最近想要刷部落格數,給自己一種努力的假象,最好的方式當然是給做過的題目做一篇題解啦 標準樹形dp題,選了父節點不能選子節點,唯一難點是基環樹的處理 先找環,只需要找到環上的兩個點就行了,其他點不用一起找出,用dfs,斷邊 斷邊的具體操作是 分別將邊上的兩個點設為根進行樹形dp,但兩個點之間還有的關係...
洛谷P2607 騎士 樹形dp
思路 首先我們想到可以對相互憎惡的倆個騎士連邊,這樣就得到了乙個圖,有多個連通塊,並且每個連通塊中最多只有乙個環。如果每個連通塊都是一顆樹,那麼這個問題就很簡單 每個節點都是選或者不選。idea1 我想可不可以把這個比樹多一條邊的圖,變成一棵樹來處理,那麼就是要刪掉環上的一條邊。考慮刪掉這條邊 u,...
樹形DP P1352 沒有上司的舞會
題目裡明確告訴了你上司與下屬的關係是一顆樹,所以這一題是很明顯的樹形dp,而因為下屬和直接上司不能同時參加,所以問題轉換成一棵樹上相鄰的節點不能同時取,求所取點和的最大值。那麼我們可以自上而下地思考,對於乙個節點,自身有取或不取兩種情況,對應這兩種情況的子樹情況也不一樣,可以分類討論 如果這個節點自...