社区讨论

100分WA求调,玄关

P8817[CSP-S 2022] 假期计划参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@m2e1fcqr
此快照首次捕获于
2024/10/18 09:14
去年
此快照最后确认于
2025/11/04 16:57
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define ll long long
using namespace std;

template<typename T>
inline void read(T &x){
	x=0;bool f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=!f;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch-48);ch=getchar();}
	x=(f?x:-x);return;
}
template<typename T>
inline void write(T x){
	if(x<0){putchar('-');x*=-1;}
	if(x>9)write(x/10);
	putchar(x%10+'0');return;
}

ll n,m,k,a,b,c,head[2505],cnt,fs[2505],vis[2505][2505];
ll flo[2505],dp[2505][5],ans,num[2505][5][5],der[2505][5],kl;
struct node{
	ll to,nxt;
}edge[7000005];

void add(int u,int v)
{
	edge[++cnt].to=v;
	edge[cnt].nxt=head[u];
	head[u]=cnt;
}

void dfs(int id,int sd)
{
	flo[id]=1;
	for(int i=head[id];i;i=edge[i].nxt)
	{
		int v=edge[i].to;
		//cout<<v<<" "<<sd<<endl;
		if(flo[v])continue;
		flo[v]=1;
		if(sd!=k)dfs(v,sd+1);
	}
}

int main()
{
	read(n);read(m);read(k);
	for(int i=2;i<=n;i++)read(fs[i]); 
	for(int i=1;i<=m;i++)
	{
		read(a);read(b);
		add(a,b);
		add(b,a);
		vis[a][b]=1;
		vis[b][a]=1;
	}
	for(int i=1;i<=n;i++)
	{
		memset(flo,0,sizeof(flo));
		dfs(i,0);
		for(int j=1;j<=n;j++)
		{
			if(vis[i][j]==1||i==j)continue;
			if(flo[j]==1)
			{
				vis[i][j]=1;
				vis[j][i]=1;
				//cout<<i<<" "<<j<<" "<<k<<endl;	
			}
		}
	}
	for(int i=1;i<=n;i++)
	{
		if(vis[1][i]==1)
		{
			dp[i][1]=fs[i];
			num[i][1][++der[i][1]]=i;	
		}
	}
	for(int f=2;f<=4;f++)
	{
		for(int i=1;i<=n;i++)
		{
			for(int j=2;j<=n;j++)
			{
				kl=0;
				for(int t=1;t<=der[j][f-1];t++)
					if(num[j][f-1][t]==i){kl=1;break;}
				if(kl)continue;
				if(vis[i][j]&&dp[j][f-1]&&dp[j][f-1]+fs[i]>dp[i][f])
				{
					for(int t=1;t<=der[j][f-1];t++)
					num[i][f][t]=num[j][f-1][t];
					der[i][f]=der[j][f-1];
					num[i][f][++der[i][f]]=i;
					dp[i][f]=dp[j][f-1]+fs[i];
				}
			}
			//cout<<dp[i][f]<<" ";
		}
		//cout<<endl;
	}
	//cout<<num[2][4][1]<<" "<<num[2][4][2]<<" "<<num[2][4][3]<<" "<<num[2][4][4];
	for(int i=1;i<=n;i++)
		if(vis[1][i])ans=max(dp[i][4],ans);
	write(ans);
	return 0;
} 

回复

2 条回复,欢迎继续交流。

正在加载回复...