好水的題呀
我們根據它邊連得性質,很容易發現它是乙個基環樹。
我們對於樹上,只要使得每個節點至少有乙個點不被選就好了,用樹形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,求最多扔下去多少個點 首先原題的意思就是支配關係 我們反向考慮 求最少保留的點 要求乙個點若扔出去 則必須存在乙個保留的點指向它 於是這就是最小支配集 只是因為是有向圖 所以乙個點要麼選...