【BZOJ-2427】軟件安裝 Tarjan + 樹形01背包

2427: [HAOI2010]軟件安裝

Time Limit:?10 Sec??Memory Limit:?128 MB
Submit:?960??Solved:?380
[Submit][Status][Discuss]

Description

現在我們的手頭有N個軟件,對于一個軟件i,它要占用Wi的磁盤空間,它的價值為Vi。我們希望從中選擇一些軟件安裝到一臺磁盤容量為M計算機上,使得這些軟件的價值盡可能大(即Vi的和最大)。
但是現在有個問題:軟件之間存在依賴關系,即軟件i只有在安裝了軟件j(包括軟件j的直接或間接依賴)的情況下才能正確工作(軟件i依賴軟件j)。幸運的是,一個軟件最多依賴另外一個軟件。如果一個軟件不能正常工作,那么它能夠發揮的作用為0。
我們現在知道了軟件之間的依賴關系:軟件i依賴軟件Di。現在請你設計出一種方案,安裝價值盡量大的軟件。一個軟件只能被安裝一次,如果一個軟件沒有依賴則Di=0,這時只要這個軟件安裝了,它就能正常工作。

Input

第1行:N, M??(0<=N<=100, 0<=M<=500)
??????第2行:W1, W2, ... Wi, ..., Wn?(0<=Wi<=M?)
??????第3行:V1, V2, ..., Vi, ..., Vn??(0<=Vi<=1000?)
??????第4行:D1, D2, ..., Di, ..., Dn?(0<=Di<=N, Di≠i?)

Output

一個整數,代表最大價值。

?

Sample Input

3 10
5 5 6
2 3 4
0 1 1

Sample Output

5

HINT

Source

Day2

Solution

把環縮成一個點...

建立超級根0....

然后樹形01背包

Code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
inline int read()
{int x=0,f=1; char ch=getchar();while (ch<'0' || ch>'9') {if (ch=='-') f=-1; ch=getchar();}while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();}return x*f;
}
#define MAXN 110
#define MAXM 510
struct EdgeNode{int next,to;}edge[MAXN<<1],road[MAXN<<1];
int head[MAXN],cnt=1,first[MAXN],tot=1;
inline void AddEdge(int u,int v) {cnt++; edge[cnt].next=head[u]; head[u]=cnt; edge[cnt].to=v;}
inline void InsertEdge(int u,int v) {if (!u) return; AddEdge(u,v);}
int w[MAXN],v[MAXN],V[MAXN],W[MAXN],N,M;
int dfn[MAXN],low[MAXN],st[MAXN],top,visit[MAXN],belong[MAXN],size[MAXN],dfsn,scc;
inline void Tarjan(int x)
{dfn[x]=low[x]=++dfsn; visit[x]=1; st[++top]=x;for (int i=head[x]; i; i=edge[i].next)if (!dfn[edge[i].to]) Tarjan(edge[i].to),low[x]=min(low[x],low[edge[i].to]);else if (visit[edge[i].to]) low[x]=min(dfn[edge[i].to],low[x]);if (dfn[x]==low[x]){int stp=0;scc++;while (x!=stp) stp=st[top--],size[scc]++,W[scc]+=w[stp],V[scc]+=v[stp],belong[stp]=scc,visit[stp]=0;}
}
inline void AddRoad(int u,int v) {tot++; road[tot].next=first[u]; first[u]=tot; road[tot].to=v;}
inline void InsertRoad(int u,int v) {AddRoad(u,v); AddRoad(v,u);}
bool flag[MAXN];
inline void Rebuild()
{for (int i=1; i<=N; i++)for (int j=head[i]; j; j=edge[j].next)if (belong[i]!=belong[edge[j].to])InsertRoad(belong[i],belong[edge[j].to]),flag[belong[edge[j].to]]=1;for (int i=1; i<=scc; i++) if (!flag[i]) InsertRoad(0,i);
}
int f[MAXN][MAXM],g[MAXN][MAXM];
void DP(int x,int last)
{    for (int i=first[x]; i; i=road[i].next)if (road[i].to!=last){DP(road[i].to,x);for (int j=M-W[x]; j>=0; j--)for (int k=0; k<j; k++)g[x][j]=max(g[x][j],g[x][k]+f[road[i].to][j-k]);}for (int i=0; i<=M-W[x]; i++) f[x][i+W[x]]=g[x][i]+V[x];
}
int main()
{N=read(),M=read();for (int i=1; i<=N; i++) w[i]=read();for (int i=1; i<=N; i++) v[i]=read();for (int f,i=1; i<=N; i++) f=read(),InsertEdge(f,i);for (int i=1; i<=N; i++) if (!dfn[i]) Tarjan(i);Rebuild();DP(0,0);printf("%d\n",f[0][M]);return 0;
}

?

轉載于:https://www.cnblogs.com/DaD3zZ-Beyonder/p/5882604.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/256365.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/256365.shtml
英文地址,請注明出處:http://en.pswp.cn/news/256365.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Hadoop目錄

1. 通過java讀取HDFS的數據 (轉&#xff09; 2. FLume監控文件夾&#xff0c;將數據發送給Kafka以及HDFS的配置文件詳解 3. 開啟hadoop和Hbase集群的lzo壓縮功能&#xff08;轉&#xff09; 4. Hadoop集群WordCount運行詳解&#xff08;轉&#xff09;轉載于:https://www.cnblo…

相機標定(二)深入理解四大坐標系與其變換關系

一、前言 視覺系統一共有四個坐標系&#xff1a;像素平面坐標系&#xff08;u,v&#xff09;、圖像坐標系&#xff08;x,y&#xff09;、相機坐標系&#xff08;Xc,Yc,Zc&#xff09;和世界坐標系&#xff08;Xw,Yw,Zw&#xff09;&#xff0c;如下圖所示。每種坐標系之間均存…

numpy——ravel()和flatten()

目錄 功能 用法 區別 flatten&#xff08;&#xff09; ravel() 功能 這兩個函數的功能都是將多維數組轉換成一維 用法 import numpy as np arr np.array([[1, 2],[3, 4]]) arr.flatten()降維默認行序優先&#xff0c;傳入參數‘F’表示列序優先 arr.flatten(F) arr.r…

Django的model中日期字段設置默認值的問題

之前寫過這樣一個model&#xff1a; class MonthlyFeeMember(models.Model):worker models.ForeignKey(Student, verbose_nameu"worker", related_name"as_monthly_fee_members")month models.CharField(umonth, max_length10, defaultget_current_month…

相機標定(三) —— 畸變校正

一、前言 根據針孔模型&#xff0c;物體和成像之間參數會滿足相似三角形的關系。但現實中會存在裝配誤差和透視失真等原因&#xff0c;導致這種關系無法成立&#xff0c;使理想成像與實際成像存在誤差&#xff0c;這種誤差即稱為畸變。 畸變分為徑向畸變&#xff0c;切向畸變和…

SVG技術入門:線條動畫實現原理

相信大家都見到過這樣神奇的技術&#xff1a;一副線條構成的畫能自動畫出自己。非常的酷。Jake Archibald是這種SVG技術的首創者&#xff0c;并且寫了一篇非常好的文章來描述它是如何實現的。Brian Suda也在24 Ways網站上討論過它。 Polygon使用它在一篇設計方面的文章里創造出…

機器學習——人工神經網絡之BP算法編程(python二分類數據集:馬疝病數據集)

目錄 一、理論知識回顧 1、神經網絡模型 2、明確任務以及參數 1&#xff09;待估參數&#xff1a; 2&#xff09;超參數&#xff1a; 3&#xff09;任務 3、神經網絡數學模型定義 1&#xff09;激活函數 ? 2&#xff09;各層權重、閾值定義 3&#xff09;各層輸入輸…

Halcon例程(基于多個標定圖的單目相機標定)詳解—— Camera_calibration_multi_image.hdev

一、前言 在我的工業相機專欄里已經將相機標定涉及到的理論部分講解完畢&#xff0c;為什么要標定以及標定要求出什么參數呢&#xff0c;用一個Halcon 例程來幫助理解。 這個例程是比較經典的標定程序&#xff0c;基本將標定過程講的比較清楚&#xff0c;用的標定圖像是系統自…

SkipList 跳表

為什么選擇跳表 目前經常使用的平衡數據結構有&#xff1a;B樹&#xff0c;紅黑樹&#xff0c;AVL樹&#xff0c;Splay Tree, Treep等。 想象一下&#xff0c;給你一張草稿紙&#xff0c;一只筆&#xff0c;一個編輯器&#xff0c;你能立即實現一顆紅黑樹&#xff0c;或者AVL樹…

Redis failover過程

在Leader觸發failover之前&#xff0c;首先wait數秒(隨即0~5)&#xff0c;以便讓其他sentinel實例準備和調整。如果一切正常&#xff0c;那么leader就需要開始將一個salve提升為master&#xff0c;此slave必須為狀態良好(不能處于SDOWN/ODOWN狀態)且權重值最低(redis.conf中)的…

機器學習——深度學習之卷積神經網絡(CNN)——LeNet卷積神經網絡結構

目錄 一、卷積神經網絡 1、卷積神經的作用 2、LeNet 1&#xff09;數據庫準備——minst 2&#xff09;模型 二、關于卷積神經網絡結構的一些術語定義 1、特征圖&#xff08;Feature map&#xff09; 2、height&#xff08;長度&#xff09;、width&#xff08;寬度&…

工業相機(3D)主要參數詳述

一、前言 準確的完成相機選型是一個視覺工程師必備的技能&#xff0c;而選型前必須對其內部參數了如指掌。工業相機是一種比較復雜的產品&#xff0c;其參數很多&#xff0c;每個參數可能會有不同的標準&#xff0c;下面對主要的參數會做比較詳細的闡述。 二、參數詳述 2.1 …

JAVA8永久代

在Java虛擬機&#xff08;以下簡稱JVM&#xff09;中&#xff0c;類包含其對應的元數據&#xff0c;比如類的層級信息&#xff0c;方法數據和方法信息&#xff08;如字節碼&#xff0c;棧和變量大小&#xff09;&#xff0c;運行時常量池&#xff0c;已確定的符號引用和虛方法表…

Struts 2初體驗

Struts2簡介&#xff1a; Struts2是一個基于MVC設計模式的Web應用框架&#xff0c;它本質上相當于一個servlet&#xff0c;在MVC設計模式中&#xff0c;Struts2作為控制器(Controller)來建立模型與視圖的數據交互。 Struts 2 目錄結構:     apps目錄&#xff1a;Struts2示例…

機器學習——深度學習之數據庫和自編碼器

目錄 一、數據庫——數據獲取 1、Mnist 2、ImageNet 二、自編碼器&#xff08;Auto-encoder&#xff09;——參數初始化 1、功能 2、基本思想 1&#xff09;訓練第一層 2&#xff09;訓練第二層及以后的神經網絡 ? 3&#xff09;利用BP對整個神經網絡的參數初始值進…

Halcon例程詳解 (深度圖轉換為3D圖像)—— xyz_attrib_to_object_model_3d

一、前言 深度圖向點云圖進行轉換是進行3D檢測項目時會遇到的問題&#xff0c;halcon里也有針對此問題的相關例程&#xff0c;下面對此例程進行分析。通過學習此例程&#xff0c;我們可以掌握如何將一張深度圖像和一張正常二維圖像轉換為3D點云。 二、分析 * 初始化界面 dev…

動態代理之Cglib淺析

什么是Cglib Cglib是一個強大的&#xff0c;高性能&#xff0c;高質量的代碼生成類庫。它可以在運行期擴展JAVA類與實現JAVA接口。其底層實現是通過ASM字節碼處理框架來轉換字節碼并生成新的類。大部分功能實際上是ASM所提供的&#xff0c;Cglib只是封裝了ASM&#xff0c;簡化了…

機器學習——深度學習之卷積神經網絡(CNN)——AlexNet卷積神經網絡結構

目錄 一、AlexNet卷積神經網絡結構模型 1、數據庫ImageNet 2、AlexNet第一層卷積層 二、AlexNet卷積神經網絡的改進 1、非線性變化函數的改變——ReLU 2、最大池化&#xff08;Max Pooling&#xff09;概念的提出——卷積神經網絡通用 1&#xff09;池化層 2&#xff0…

POJ - 3470 Walls

小鳥往四個方向飛都枚舉一下&#xff0c;數據范圍沒給&#xff0c;離散以后按在其中一個軸線排序&#xff0c;在線段樹上更新墻的id&#xff0c;然后就是點查詢在在哪個墻上了。 這題有個trick&#xff0c;因為數據范圍沒給我老以為是inf設置小了&#xff0c;WA了很多發。&…

C# —— 深入理解委托類型

一. 委托定義 1. 委托與多播委托 委托類型表示對具有特定參數列表和返回類型的方法的引用&#xff0c;定義了委托實例可以調用的某類方法。 通過委托&#xff0c;我們可以動態的通過委托變量來調用委托方法。一般用delegate來命名委托類型,但Action和Func也可以達到同樣的效果…