比赛 CSP2022提高组 评测结果 AAAAAAWWWWWAAAAWWWWA
题目名称 假期计划 最终得分 55
用户昵称 00000 运行时间 1.445 s
代码语言 C++ 内存使用 22.48 MiB
提交时间 2022-10-30 11:27:30
显示代码纯文本
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,m,k,a[5000],ans;
vector<ll> g[5000];
queue<ll> p;
ll dl[3000][3000];//最短路 
ll mem[5000];
ll b1[3000],b2[3000],b3[3000];
void dfs(ll x,ll r,ll lx)
{
	if(r==3)
	{
		if(a[lx]>a[b1[x]])
		{
			b3[x]=b2[x];
			b2[x]=b1[x];
			b1[x]=lx;
		}else
		{
			if(a[lx]>a[b2[x]])
			{
				b3[x]=b2[x];
				b2[x]=lx;
			}else
			{
				if(a[lx]>a[b3[x]]) b3[x]=lx;
			}
		}
		return;
	}
	for(int q=1;q<=n;q++)
	{
		if(mem[q]==0&&dl[x][q]<=k+1)
		{
			mem[q]=1;
			dfs(q,r+1,x);
			mem[q]=0;
		}
	}
}
int main(){
	freopen("csp2022_holiday.in","r",stdin);
	freopen("csp2022_holiday.out","w",stdout);
cin>>n>>m>>k;
for(int q=2;q<=n;q++) cin>>a[q];
for(int q=1;q<=m;q++)
{
	ll x,y;
	cin>>x>>y;
	g[x].push_back(y);
	g[y].push_back(x);
}
for(int q=1;q<=n;q++)
{
	dl[q][q]=0;mem[q]=1;
	for(ll w:g[q])
	{
		p.push(w);
		dl[q][w]=1;
		mem[w]=1;
	}
	while(p.size())
	{
		ll x=p.front();
		p.pop();
		for(ll w:g[x])
		{
			if(mem[w]==0)
			{
					p.push(w);
				dl[q][w]=dl[q][x]+1;
				mem[w]=1;
			}
		}
	}
	memset(mem,0,sizeof(mem));
}
mem[1]=1;
dfs(1,1,0);
for(int q=2;q<=n;q++)
{
	for(int w=q+1;w<=n;w++)
	{
		if(dl[q][w]<=k+1)
		{
			if(b1[q]!=w&&b1[q])
			{
				if(b1[w]!=q&&b1[w]!=b1[q]&&b1[w]) ans=max(ans,a[q]+a[w]+a[b1[q]]+a[b1[w]]);
				if(b2[w]!=q&&b2[w]!=b1[q]&&b2[w]) ans=max(ans,a[q]+a[w]+a[b1[q]]+a[b2[w]]);
				if(b3[w]!=q&&b3[w]!=b1[q]&&b3[w]) ans=max(ans,a[q]+a[w]+a[b1[q]]+a[b3[w]]);
			}
			if(b2[q]!=w&&b2[q])
			{
				if(b1[w]!=q&&b1[w]!=b2[q]&&b1[w]) ans=max(ans,a[q]+a[w]+a[b2[q]]+a[b1[w]]);
				if(b2[w]!=q&&b2[w]!=b2[q]&&b2[w]) ans=max(ans,a[q]+a[w]+a[b2[q]]+a[b2[w]]);
				if(b3[w]!=q&&b3[w]!=b2[q]&&b3[w]) ans=max(ans,a[q]+a[w]+a[b2[q]]+a[b3[w]]);
			}
			if(b3[q]!=w&&b3[q])
			{
				if(b1[w]!=q&&b1[w]!=b3[q]&&b1[w]) ans=max(ans,a[q]+a[w]+a[b3[q]]+a[b1[w]]);
				if(b2[w]!=q&&b2[w]!=b3[q]&&b2[w]) ans=max(ans,a[q]+a[w]+a[b3[q]]+a[b2[w]]);
				if(b3[w]!=q&&b3[w]!=b3[q]&&b3[w]) ans=max(ans,a[q]+a[w]+a[b3[q]]+a[b3[w]]);
			}
		}
	}
}
cout<<ans;
return 0;
}