題意:給你n個點,n-1個邊構成有向數,同時每個點都有乙個權值,現在給你k次操作,每次操作你必須從根節點1出發,然後走到乙個葉節點結束然後將它們點的權值累加,同時走過的點的權值不可以重複計算,問你k次之後最大得到多大的值。
做法:我們倒著存邊,兩次dfs第一次求每個點到根節點的權值,然後將這個權值從大到小排序,第二次dfs貪心遍歷每個從大到小排好序的節點,最後將得到的遍歷結果再從大到小排序,取前k個數求和。
#includeusingnamespace
std;
const
int maxn=1e5+10
;#define ll long long
struct
note
ye[maxn];
ll val[maxn];
ll sum[maxn],cnt;
ll s[maxn];
vector
v[maxn];
ll dfs(
intt)
ll dfs1(
intu)
return
sum[u];
}bool
cmp(note a,note b)
intmain()
cnt=0
;
for(int i=1; i<=n; i++)
for(int i=1; i<=n; i++)
sort(ye+1,ye+1+n,cmp);
memset(sum,
0,sizeof
(sum));
for(int i=1; i<=n; i++)
s[i]=dfs1(ye[i].id);
ll ans=0
; sort(s+1,s+1+n);
for(int i=1; i<=m; i++)
ans+=s[n-i+1
]; printf(
"case #%d: %lld\n
",it,ans);
}}
樹上dfs 思維
the number lamp a i,it is hanging on and 0,if is there is no such lamp 表示的是祖先的序號 題目中的坑 應該自下而上的判斷子樹的累加和是否滿足條件。如果是自上而下的判斷,一旦該樹的子樹有滿足條件的,去掉子樹後又滿足條件這種情況是無...
樹上求和(dfs
有一棵包含n個節點和n 1條邊的樹,規定樹鏈 u,v 為樹上從u到v的簡單路徑。樹的每條邊上都有乙個正整數,這個正整數被稱作這條邊的顏色,規定一條樹鏈的權值w u,v 為這條樹鏈上所有邊的顏色的代數和。而整棵樹的權值為所有不同的樹鏈的權值的代數和。已知所有邊的顏色集合恰好為1到n 1這n 1個不同的...
樹上貪心問題學習筆記
每個點可以控制其周圍距離不超過k的點 選擇最少數量的點使得整棵樹被控制 1.從樹上選擇點不相交的最多條長度 k的鏈 貪心策略 從下向上貪心,能合併就盡量合併,並不能合併就向上傳遞最長的單鏈 2.從樹上選擇邊不相交的最多條長度 k的鏈 貪心策略 從下向上貪心,同乙個節點的多個兒子中轉化為這樣乙個問題 ...