95pts求助 WA#17
查看原帖
95pts求助 WA#17
217233
SqrtSecond楼主2022/10/31 08:40
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int inf=4e18;
inline int read()
{
	char ch=getchar();int x=0,r=1;
	while(ch<'0'||ch>'9'){if(ch=='-')r=0;ch=getchar();}
	while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
	return r?x:-x;
}
int n,m,k,dis[2510],u,x,y;
vector<int> e[2510],can[2510];
int anss,a[2510],ans[2510][8];
queue<int> q;
void bfs(int xx)
{
	for(int i=1;i<=n;++i)dis[i]=inf;
	dis[xx]=0;q.push(xx);
	while(!q.empty())
	{
		u=q.front();q.pop();
		if(u!=xx)can[xx].push_back(u);
		if(dis[u]==k+1)continue;
		for(int v:e[u])if(dis[v]==inf)dis[v]=dis[u]+1,q.push(v);
	}
}
signed main()
{
	n=read();m=read();k=read();
	for(int i=2;i<=n;++i)a[i]=read();
	while(m--)
	{
		x=read();y=read();
		e[x].push_back(y);e[y].push_back(x);
	}
	for(int i=1;i<=n;++i)bfs(i);
	for(int i=2;i<=n;++i)for(int j=0;j<=3;++j)ans[i][j]=-inf;
	for(int i:can[1])
	{
		for(int j:can[i])
		{
			if(j==1)continue;
			for(int o=0;o<=6;o+=2)
			if(a[i]+a[j]>ans[j][o])
			{
				for(int p=o+2;p<=6;p+=2)ans[j][p]=ans[j][p-2],ans[j][p+1]=ans[j][p-1];
				ans[j][o]=a[i]+a[j];ans[j][o+1]=i;
				break;
			}
		}
	}
	for(int i=2;i<=n;++i)
	for(int j:can[i])
	{
		if(j<i)continue;
		for(int o=0;o<=6;o+=2)
		{
			if(ans[i][o+1]==j||ans[i][o]==-inf)continue;
			for(int p=0;p<=6;p+=2)
			if(ans[j][p+1]!=i&&ans[i][o+1]!=ans[j][p+1]&&ans[j][p]!=-inf)anss=max(anss,ans[i][o]+ans[j][p]);
		}
	}
	printf("%lld\n",anss);
	return 0;
}
2022/10/31 08:40
加载中...