NOIP模擬賽 創世紀

2021-10-07 04:00:04 字數 1011 閱讀 3707

好水的題呀

我們根據它邊連得性質,很容易發現它是乙個基環樹。

我們對於樹上,只要使得每個節點至少有乙個點不被選就好了,用樹形dp可以解決,分別求出選這個點與不選這個點時的值。

而對於環上的部分,我們就找到兩個相鄰的點,跑一邊環用先前的dp值找出環的最大值,加在一起就行了。

#include#include#include#include#include#include#include#include#include#includeusing namespace std;

#define maxn 1000005

typedef long long ll;

typedef pairpii;

#define gc() getchar()

templatevoid read(_t &x)

while(s>='0'&&s<='9')

x*=f;

}template_t fabs(_t x)

int n,fa[maxn],deg[maxn],ans;

int val1[maxn],val2[maxn];

vectorg[maxn];

queueq;

bool vis[maxn];

void dfs(int x,int fa)

if(!flag)val1[x]+=maxx;

}int solve(int x)

res=max(w1,w2);

t=x;w1=val1[t];w2=val2[t];t=fa[t];

while(t!=x)

return max(res,max(w1,w2));

}signed main()

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

for(int i=1;i<=n;i++)if(!vis[i]&°[i])ans+=solve(i);

printf("%d",ans);

return 0;

}

NOIP2014模擬11 6 創世紀

這題,我們可以轉化成乙個圖論問題,我們只需要記錄入度個數就好了 首先,然後我們把它刪掉之後,就可以看到,它所能控制的點就合法了,因為它可以被乙個不合法的點控制,並把合法的點的出度刪掉。每次就是這樣做。最後一種gg的情況,要特判一下。就是有環的情況 於是,這樣一題看似很難的題就被化成乙個沒有任何演算法...

BZOJ 3037 創世紀 樹形DP

題目大意 給定一張有向圖,每個點有且僅有一條出邊,要求若乙個點x扔下去,至少存在乙個保留的點y,y的出邊指向x,求最多扔下去多少個點 首先原題的意思就是支配關係 我們反向考慮 求最少保留的點 要求乙個點若扔出去 則必須存在乙個保留的點指向它 於是這就是最小支配集 不過由於是有向圖 所以乙個點要麼選擇...

BZOJ 3037 創世紀 樹形DP

題目大意 給定一張有向圖,每乙個點有且僅有一條出邊,要求若乙個點x扔下去,至少存在乙個保留的點y,y的出邊指向x,求最多扔下去多少個點 首先原題的意思就是支配關係 我們反向考慮 求最少保留的點 要求乙個點若扔出去 則必須存在乙個保留的點指向它 於是這就是最小支配集 只是因為是有向圖 所以乙個點要麼選...