題解 P2014 選課(樹形DP 拓撲)

2021-08-07 07:27:33 字數 664 閱讀 6923

題意:現在有n門功課,每門課有一定的價值,但是課程可能需要一門先修課,問選m門課程能獲得的最大價值。

分析:剛剛開始我以為這道題可能會出現環的情況(如:haoi 2010軟體安裝,但是又不會tarjan,本欲放棄,但是忽然眼角餘光瞟到討論班裡有人說這道題沒有環…好吧,這樣就比較easy了。

首先我們要用乙個超級根節點將森林連成一棵數,然後可以利用一下拓撲來處理樹的所有葉子節點,一層一層往上推進,直到處理完根節點。

ps:一定要記得讓m++,因為根節點也要錢啊!!!

**如下:

#include 

using

namespace

std;

struct node p[400];

queue

< int > q;

int f[400][400];

int n,m;

int main()

for(i=1;i<=n;i++)

if(p[i].son==0)

q.push(i);

while(!q.empty())

for(i=m;i>=0;i--) }}

printf("%d",f[0][m]);

return

0;}

by:chlience

選課 P2014 樹形DP

在大學裡每個學生,為了達到一定的學分,必須從很多課程裡選擇一些課程來學習,在課程裡有些課程必須在某些課程之前學習,如高等數學總是在其它課程之前學習。現在有n門功課,每門課有個學分,每門課有一門或沒有直接先修課 若課程a是課程b的先修課即只有學完了課程a,才能學習課程b 乙個學生要從這些課程裡選擇m門...

P2014 選課(樹形DP)

傳送門 樹形dp入門題。這類題目被稱為揹包樹形dp,又稱有樹形依賴的揹包問題。雖說是入門題,但第一次寫並不是很順利,網上的解法都是二維的,但我只會先用高維做再轉成低維的,搞的就很難受。三維解法,思路見注釋 include include include define maxn 305 using n...

洛谷P2014 選課 樹形dp

給出n 300 n leq300 n 30 0個結點,每個結點都有乙個權值,然後一些結點必須只有選了前驅結點這個結點才可以被選。現在最多選m 300 m leq300 m 30 0個結點,求最大權值。實際上這個是乙個森林,但是通過設定乙個權值為0 00的虛點0 00,把所有的沒有前驅的點全部連到這個...