求助一下,维护前三大的值wa 只有80pts
查看原帖
求助一下,维护前三大的值wa 只有80pts
222341
twocats楼主2022/10/31 20:21
#include<bits/stdc++.h>
#define F(i,j,k) for(register int i=j,E=k;i<=E;i++)
#define FG(i,v) for(register int i=0,E=v.size();i<E;i++)
#define int long long
#define pb push_back
#define N 2510
#define inf 10010
using namespace std;

int n,m,k,x,y,ans,v[N],vis[N][N],d[N][N],f[N],Max[N],cMax[N],ccMax[N],p[N],cp[N],ccp[N];

vector<int> G[N];

void disdp(int s)
{
	queue<int> q;
	q.push(s),vis[s][s]=1;
	while(!q.empty())
	{
		int u=q.front();
		q.pop();
		if(d[s][u]>=k)	continue;
		FG(i,G[u])
		{
			int t=G[u][i];
			if(vis[s][t])	continue;
			vis[s][t]=1;
			d[s][t]=d[s][u]+1;
			q.push(t);
		}
	}
}

signed main()
{
//	freopen("holiday.in","r",stdin);
//	freopen("holiday.out","w",stdout);
	cin>>n>>m>>k;
	F(i,0,n)	F(j,0,n)	d[i][j]=inf;
	F(i,2,n)	cin>>v[i];
	F(i,0,n)	d[i][i]=-1;
	F(i,1,m)	cin>>x>>y,G[x].pb(y),G[y].pb(x);
	F(i,1,n)	disdp(i);
	F(i,1,n)	if(d[1][i]<=k)	f[i]=v[i];
	F(i,2,n)	F(j,2,n)
	{
		if(d[i][j]>k||i==j)	continue;
		if(Max[j]<f[i]+v[j])
		{
			ccMax[j]=cMax[j];
			ccp[j]=cp[j];
			cMax[j]=Max[j];
			cp[j]=p[j];
			Max[j]=f[i]+v[j];
			p[j]=i;
		}
		else if(cMax[j]<f[i]+v[j])
		{
			ccMax[j]=cMax[j];
			ccp[j]=cp[j];
			cMax[j]=f[i]+v[j];
			cp[j]=i;
		}
		else if(ccMax[j]<f[i]+v[j])
		{
			ccMax[j]=f[i]+v[j];
			ccp[j]=i;
		}
	}
	F(i,2,n)	F(j,2,n)
	{
		if(p[i]!=p[j]&&p[i]!=j&&p[j]!=i&&i!=j&&d[i][j]<=k)
		{
			ans=max(ans,Max[i]+Max[j]);
		}
		if(cp[i]!=p[j]&&cp[i]!=j&&p[j]!=i&&i!=j&&d[i][j]<=k)
		{
			ans=max(ans,cMax[i]+Max[j]);
		}
		if(p[i]!=cp[j]&&p[i]!=j&&cp[j]!=i&&i!=j&&d[i][j]<=k)
		{
			ans=max(ans,Max[i]+cMax[j]);
		}
		if(cp[i]!=cp[j]&&cp[i]!=j&&cp[j]!=i&&i!=j&&d[i][j]<=k)
		{
			ans=max(ans,cMax[i]+cMax[j]);
		}
		
		if(ccp[i]!=p[j]&&ccp[i]!=j&&p[j]!=i&&i!=j&&d[i][j]<=k)
		{
			ans=max(ans,ccMax[i]+Max[j]);
		}
		if(p[i]!=ccp[j]&&p[i]!=j&&ccp[j]!=i&&i!=j&&d[i][j]<=k)
		{
			ans=max(ans,Max[i]+ccMax[j]);
		}
		if(ccp[i]!=cp[j]&&ccp[i]!=j&&cp[j]!=i&&i!=j&&d[i][j]<=k)
		{
			ans=max(ans,ccMax[i]+cMax[j]);
		}
		if(cp[i]!=ccp[j]&&cp[i]!=j&&ccp[j]!=i&&i!=j&&d[i][j]<=k)
		{
			ans=max(ans,cMax[i]+ccMax[j]);
		}
		
		if(ccp[i]!=ccp[j]&&ccp[i]!=j&&ccp[j]!=i&&i!=j&&d[i][j]<=k)
		{
			ans=max(ans,ccMax[i]+ccMax[j]);
		}
	}
	printf("%lld",ans);
	return 0;
}
2022/10/31 20:21
加载中...