開始沒有看懂題,以為就是個樹形依賴揹包,打完之後w40,然後才發現它會有還,要用tarjan縮完點後跑揹包,要建立乙個虛擬節點0連線所有的子圖(注意連線的位置)。
錯誤示範:
1for(int i=1;i<=n;i++)//這樣會導致0連線的不是入度為0的點(或環)
2if(!dsn[i])
3
正確**:
1for(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分 回來發現原來這題並沒有說是一棵樹...