樹上dfs 思維

2021-07-27 05:36:17 字數 741 閱讀 3449

the number lamp a

i, it is hanging on (and 0, if is there is no such lamp), 表示的是祖先的序號

題目中的坑:應該自下而上的判斷子樹的累加和是否滿足條件。如果是自上而下的判斷,一旦該樹的子樹有滿足條件的,去掉子樹後又滿足條件這種情況是無法識別出來。只能一回溯,且實際上回溯的複雜度並不高,相當於遍歷所有點兩遍。

解析:dfs 判斷累加和。如果乙個子樹滿足條件,價值變為零,兩棵及以上滿足條件則成功(恰好兩棵需要額外判斷不是根節點)

**:

#include using namespace std;

typedef long long ll;

int const maxn = 1000006;

vectorson[maxn];

int t[maxn],p,root;

int pa[maxn],ans[2];

int num = 0;

void dfs(int x)

if(t[x] == p && x != root)

}int main()

bool flag = false;

if(sum % 3 != 0 || sum == 0)

else

else

}if(flag == true)

printf("-1\n");

return 0;

}

樹上求和(dfs

有一棵包含n個節點和n 1條邊的樹,規定樹鏈 u,v 為樹上從u到v的簡單路徑。樹的每條邊上都有乙個正整數,這個正整數被稱作這條邊的顏色,規定一條樹鏈的權值w u,v 為這條樹鏈上所有邊的顏色的代數和。而整棵樹的權值為所有不同的樹鏈的權值的代數和。已知所有邊的顏色集合恰好為1到n 1這n 1個不同的...

E Game 樹上dfs貪心

題意 給你n個點,n 1個邊構成有向數,同時每個點都有乙個權值,現在給你k次操作,每次操作你必須從根節點1出發,然後走到乙個葉節點結束然後將它們點的權值累加,同時走過的點的權值不可以重複計算,問你k次之後最大得到多大的值。做法 我們倒著存邊,兩次dfs第一次求每個點到根節點的權值,然後將這個權值從大...

牛客 樹上博弈 思維

題目大意 給出一棵樹,現在有兩個人在玩乙個遊戲,兩人依次在樹上行走,只能走沒有人的結點,無法行走的人失敗,題目需要我們求出有多少個初始點對,對於先手而言是必勝的情況 題目分析 其實稍微畫圖就能看出來,如果初始時兩個人之間的距離為偶數,那麼先手必勝,否則先手必敗,因為如果初始距離為偶數的話,那麼先手總...