E Game 樹上dfs貪心

2022-06-03 07:06:09 字數 1035 閱讀 8529

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

做法:我們倒著存邊,兩次dfs第一次求每個點到根節點的權值,然後將這個權值從大到小排序,第二次dfs貪心遍歷每個從大到小排好序的節點,最後將得到的遍歷結果再從大到小排序,取前k個數求和。

#includeusing

namespace

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的鏈 貪心策略 從下向上貪心,同乙個節點的多個兒子中轉化為這樣乙個問題 ...