HAOI2010 軟體安裝

2022-03-27 16:34:01 字數 1510 閱讀 5882

開始沒有看懂題,以為就是個樹形依賴揹包,打完之後w40,然後才發現它會有還,要用tarjan縮完點後跑揹包,要建立乙個虛擬節點0連線所有的子圖(注意連線的位置)。

錯誤示範:

1

for(int i=1;i<=n;i++)//這樣會導致0連線的不是入度為0的點(或環)

2if(!dsn[i])

3

正確**:

1

for(int i=1;i<=tot;i++)

2if(!du[i])

3 add2(0,i);

在縮點是記錄每個scc的入度,0直接和入度為0的scc連線。

#include#include#include#include#define maxn 110

#define ma(x) memset(x,0,sizeof(x))

using namespace std;

struct edge

ed[5010],ed2[5010];

int first[maxn],num_e;

#define f(x) first[x]

int first2[maxn],num_e2;

#define f2(x) first2[x]

int n,m;

int w[maxn],v[maxn],d[maxn];

int w2[maxn],v2[maxn];

int dsn[maxn],low[maxn],cnt;

int stack[maxn],top;

bool vi[maxn];

int belong[maxn],tot;

int du[maxn];

vectorscc[maxn];

void tarjan(int x)

scc[tot].push_back(stack[top]);

belong[stack[top--]]=tot; }}

inline void add(int u,int v)

inline void add2(int u,int v)

int f[maxn][510];

void dfs(int x) }}

signed main()

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

if(!dsn[i])

tarjan(i);

for(int i=1;i<=num_e;i++)

if(belong[u(i)]!=belong[v(i)])

for(int i=1;i<=tot;i++)

if(!du[i])

add2(0,i);

for(int i=1;i<=tot;i++) }

dfs(0);

int ans=0;

for(int i=1;i<=m;i++)ans=max(ans,f[belong[0]][i]);

printf("%d\n",ans);

}

HAOI2010 軟體安裝

現在我們的手頭有n個軟體,對於乙個軟體i,它要占用wi的磁碟空間,它的價值為vi。我們希望從中選擇一些軟體安裝到一台磁碟容量為m計算機上,使得這些軟體的價值盡可能大 即vi的和最大 但是現在有個問題 軟體之間存在依賴關係,即軟體i只有在安裝了軟體j 包括軟體j的直接或間接依賴 的情況下才能正確工作 ...

HAOI2010 軟體安裝

現在我們的手頭有n個軟體,對於乙個軟體i,它要占用wi的磁碟空間,它的價值為vi。我們希望從中選擇一些軟體安裝到一台磁碟容量為m計算機上,使得這些軟體的價值盡可能大 即vi的和最大 但是現在有個問題 軟體之間存在依賴關係,即軟體i只有在安裝了軟體j 包括軟體j的直接或間接依賴 的情況下才能正確工作 ...

HAOI2010 軟體安裝

傳送門 一開始我以為這道題是乙個比較正常的分組揹包,只不過原來做的題目的限制條件是數目,這次是有體積 軟體所佔空間 的限制,但是兩者好像沒什麼差異 於是我就仿著正常的分組揹包寫了一下,然後過了樣例。我才不會告訴你我一開始結果全是0,因為我寫錯了 交上去一看只有10分 回來發現原來這題並沒有說是一棵樹...