关于T2写了DP但不知道有多少分
  • 板块学术版
  • 楼主yzh_Error404Error
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/10/29 20:50
  • 上次更新2023/10/27 05:04:03
查看原帖
关于T2写了DP但不知道有多少分
126871
yzh_Error404Error楼主2022/10/29 20:50

RT

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN=2505;
const int MAXM=2e5+5;
struct node
{
	int to,nxt;
}e[MAXM];
int head[MAXM],cnt;
inline void add(int x,int y)
{
	e[++cnt].to=y;
	e[cnt].nxt=head[x];
	head[x]=cnt;
}
int n,m,k;
int val[MAXN];
bitset<MAXN>vis;
int dis[MAXN];
bool ct[MAXN][MAXN];
int dp[MAXN][5];
int path[MAXN][5][5];//记录x的路径 
vector<pair<int,int> >v1,v2;
signed main()
{
//	freopen("holiday.in","r",stdin);
//	freopen("holiday.out","w",stdout);	
	scanf("%lld%lld%lld",&n,&m,&k);
	for(register int i=2;i<=n;i++)
		scanf("%lld",&val[i]);
	for(register int i=1;i<=m;i++)
	{
		int x,y;
		scanf("%lld%lld",&x,&y);
		add(x,y);
		add(y,x);
	}
	for(register int i=1;i<=n;i++)
	{
		memset(dis,0x3f,sizeof dis);
		queue<int>q;
		q.push(i);
		dis[i]=-1;
		while(!q.empty())
		{
			int x=q.front();
			q.pop();
			vis[x]=0;
			for(register int j=head[x];j;j=e[j].nxt)
			{
				int y=e[j].to;
				if(dis[y]>dis[x]+1)
				{
					dis[y]=dis[x]+1;
					if(!vis[y])
					{
						vis[y]=1;
						q.push(y);
					}
				}
			}
		}
		for(register int j=1;j<=n;j++)
			if(dis[j]<=k)ct[i][j]=1;
	}
	for(register int tim=1;tim<=4;tim++)
		for(register int i=1;i<=n;i++)
			for(register int j=2;j<=n;j++)
			{
				bool flag=false;
				if((i==j)||(!ct[i][j]))continue;
				if(tim==1&&(!ct[1][j]))continue;
				if(tim==4&&(!ct[1][j]))continue;
				for(register int l=1;l<=4;l++)
					if(j==path[i][tim-1][l])flag=true;
				if(flag)continue;
				if(dp[j][tim]<dp[i][tim-1]+val[j])
				{
					dp[j][tim]=dp[i][tim-1]+val[j];
					for(register int l=1;l<=4;l++)
						path[j][tim][l]=path[i][tim-1][l];
					path[j][tim][tim]=j;
				}
			}
	int maxn=0;
	for(register int i=1;i<=n;i++)
	{
		bool skip=false;
		for(register int k=1;k<=4;k++)
		{
//			printf("%d ",path[i][4][k]);
			if(!path[i][4][k])skip=true;
		}
//		printf("%d",dp[i][4]);
//		puts("");
		if(skip)continue;
		maxn=max(maxn,dp[i][4]);
	}
	printf("%lld",maxn);
	return 0;
}

民间数据甚至90分

2022/10/29 20:50
加载中...