dp40分求条
查看原帖
dp40分求条
727076
hexz01楼主2024/7/5 09:34
#include <iostream>
#include <vector>
using namespace std;
const int N=10007;
int n;
vector<int> e[N];
int dp[N][3];
void dfs(int x, int fa){
	for(int i=0;i<e[x].size();i++)
		if(fa!=e[x][i])
			dfs(e[x][i], x);
	dp[x][0]=1;
	for(int i=0;i<e[x].size();i++)
		if(fa!=e[x][i])
			dp[x][0]+=dp[e[x][i]][2];
	dp[x][1]=dp[x][0];
	for(int i=0;i<e[x].size();i++){
		if(fa!=e[x][i]){
			int sum=dp[e[x][i]][0];
			for(int j=0;j<e[x].size();j++)
				if(fa!=e[x][j] && e[x][i]!=e[x][j])
					sum+=dp[e[x][j]][1];
			dp[x][1]=min(dp[x][1], sum);
		}
	}
	for(int i=0;i<e[x].size();i++)
		if(fa!=e[x][i])
			dp[x][2]+=dp[x][1];
	dp[x][2]=min(dp[x][1], dp[x][2]);
}
int main(){
	cin>>n;
	for(int i=1;i<n;i++){
		int x, y;
		cin>>x>>y;
		e[x].push_back(y);
		e[y].push_back(x);
	}
	dfs(1, 0);
	cout<<dp[1][1]<<endl;
	return 0;
}

WA #4-9 状态表示: dp[x][0]表示在点x管到x的上面一层的最小信号塔数。 dp[x][1]表示在点x管到x这一层的最小信号塔数。 dp[x][2]表示在点x管到x的下面一层的最小信号塔数。

2024/7/5 09:34
加载中...