求助:数据1,数据9WA
查看原帖
求助:数据1,数据9WA
409518
Zzz_yigui楼主2023/10/12 08:25

****求助:数据1,数据9WA

#include<bits/stdc++.h>
using namespace std;
int n,dp[1005][5],u,v,mi=1000000;
vector <int> mp[1005];
void bfs(int x,int fa){
	if(mp[x].size()==1&&mp[x][0]==fa){
		dp[x][0]=1;
		dp[x][1]=1;
		dp[x][2]=1;
		dp[x][3]=0;
		dp[x][4]=0;
		return;
	}
	int s1=0,s2=0,s3=0,s4=0;
	for(int i=0;i<mp[x].size();i++){
		if(mp[x][i]!=fa){
			bfs(mp[x][i],x);
			s1+=dp[mp[x][i]][1];
			s2+=dp[mp[x][i]][2];
			s3+=dp[mp[x][i]][3];
			s4+=dp[mp[x][i]][4];
		}
	}
	for(int i=1;i<mp[x].size();i++){
		if(mp[x][i]!=fa){
			dp[x][1]=min(dp[x][1],s3-dp[mp[x][i]][3]+dp[mp[x][i]][0]);
			dp[x][2]=min(dp[x][2],s2-dp[mp[x][i]][2]+dp[mp[x][i]][1]);
		}
		dp[x][4]=s3; 
		dp[x][3]=s2;
		dp[x][0]=s4+1;
		dp[x][1]=min(dp[x][1],dp[x][0]);
		dp[x][2]=min(dp[x][2],dp[x][1]);
		dp[x][3]=min(dp[x][3],dp[x][2]);
		dp[x][4]=min(dp[x][4],dp[x][3]);
	}
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		for(int j=0;j<=4;j++)dp[i][j]=1000000;
	}
	for(int i=2;i<=n;i++){
		cin>>u;
		mp[u].push_back(i);
		mp[i].push_back(u);
	}
	mp[1].push_back(0);
	bfs(1,0);
	for(int i=0;i<=2;i++)mi=min(mi,dp[1][i]);
	cout<<mi;
	return 0;
}

逻辑:以1为根,从叶节点出发向内,维护数组DP[i][j]表示此节点最近的子消防站 提交详情:https://www.luogu.com.cn/record/128855203

2023/10/12 08:25
加载中...