bzoj2427 軟體安裝

2021-08-09 14:57:28 字數 1546 閱讀 5594

軟體安裝

題目背景:

bzoj2427

分析:樹型dp

原圖有環·····並且好像有和其他部分不連通的單個環······

這個題,顯然應該是一些環和一些樹放到一起,那麼顯然的對於乙個環要麼全部選擇,要麼乙個都不選,那麼我們先

tarjan

縮點一發每乙個

scc的

w為原來所有

w的和,

v為原來所有的

v和,然後就成了一片森林,對於每棵樹的根,我們向它連線乙個虛擬根節點,然後直接樹型

dp即可,定義

f[i][j]

為,對於i和

i的子樹,話費

j的最優價值。

注意:因為依存關係的存在,如果父節點不選擇是不能選擇子節點的,所以可以先將父節點的已有權值提出來,直接

dp剩下的即可。

錯誤:知道嗎,

tarjan

第二行的判斷是,

if (vis[v])

不是vis[cur]

······

source:

/*

created by scarlyw

*/#include #include #include #include #include #include #include #include #include #include const int maxn = 100 + 10;

const int maxm = 500 + 10;

int n, m, o, ind, top;

int w[maxn], v[maxn], d[maxn], f[maxn][maxm], val[maxn], sw[maxn];

int low[maxn], num[maxn], scc[maxn], scnt[maxn];

std::vectorori_edge[maxn], edge[maxn], s;

bool vis[maxn], map[maxn][maxn];

inline void add_ori_edge(int x, int y)

inline void read_in()

}inline void tarjan(int cur)

if (low[cur] == num[cur]) while (o != cur); }}

inline void dfs(int cur)

for (int i = m; i >= sw[cur]; --i)

f[cur][i] = f[cur][i - sw[cur]] + val[cur];

for (int i = 0; i < sw[cur]; ++i) f[cur][i] = 0;

}inline void solve()

} }for (int i = 1; i <= top; ++i) if (!vis[i]) edge[0].push_back(i);

dfs(0), std::cout << f[0][m];

}int main()

BZOJ 2427 軟體安裝 O nm 樹形揹包

time limit 10 sec memory limit 128 mb submit 1913 solved 757 submit status discuss 現在我們的手頭有 n個軟體,對於乙個軟體 i,它要占用 wi的磁碟空間,它的價值為 vi。我們希望從中選擇一些軟體安裝到一台磁碟容量為...

BZOJ 2427 分塊裸題

題意 sol 推薦乙個大神犇的blog,講的還是很好的 主要我喜歡他的 風格 逃 太裸沒什麼意思.雖然好些但碼碼也挺長的.還是貼那個大神的 天天看著 打的會不會好看點 include include include include include include using namespace st...

BZOJ 2427 HAOI2010 軟體安裝

time limit 10 sec memory limit 128 mb submit 2146 solved 865 submit status discuss description 現在我們的手頭有n個軟體,對於乙個軟體i,它要占用wi的磁碟空間,它的價值為vi。我們希望從中選擇一些軟體安裝...