60分,求调
查看原帖
60分,求调
628248
CCF_Friend楼主2023/11/26 10:29
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=2510;
int dis[maxn][maxn],ans,n,m,k,vis[maxn],p[maxn];
vector<int> v[maxn],a[maxn];
set<pair<int,int> > st[maxn];
void bfs(int s)
{
	memset(vis,0,sizeof(vis));
	memset(dis[s],0x3f,sizeof(dis[s]));
	queue<int> q;
	q.push(s);
	vis[s]=1;
	dis[s][s]=0;
	while(q.size())
	{
		int l=q.front();
		q.pop();
		for(int i=0;i<a[l].size();i++)
		{
			if(!vis[a[l][i]])
			{
				dis[s][a[l][i]]=dis[s][l]+1;
				vis[a[l][i]]=1;
				q.push(a[l][i]);
			}
		}
	} 
}
signed main()
{
	cin>>n>>m>>k;
	for(int i=2;i<=n;i++) cin>>p[i];
	for(int i=1;i<=m;i++)
	{
		int x,y;
		cin>>x>>y;
		a[x].push_back(y);
		a[y].push_back(x); 
	}
	for(int i=1;i<=n;i++)
	{
		bfs(i);
		for(int j=1;j<=n;j++)
		{
			if(dis[i][j]<=k+1&&i!=j)
			{
				v[i].push_back(j);
				v[j].push_back(i);
			}
		}
	}
	for(int i=2;i<=n;i++)
	{
		for(int j=0;j<v[i].size();j++)
		{
			if(dis[1][v[i][j]]<=k+1&&v[i][j]!=1) st[i].insert({-p[v[i][j]],v[i][j]});
		}
	}
	for(int b=2;b<=n;b++)
	{
		for(int i=0;i<v[b].size();i++)
		{
			int c=v[b][i];
			int a=0,d=0,t=0; 
			if(c==1) continue;
			while(!a&&t<st[b].size())
			{
				auto kk=st[b].begin();
				int x=kk->first;
				int y=kk->second;	
				if(y!=c)
				{
					a=y;
				}
				t++;
				kk=next(kk);
			}
			t=0;
			while(!d&&t<st[c].size())
			{
				auto kk=st[c].begin();
				int x=kk->first;
				int y=kk->second;
				if(y!=b&&y!=a)
				{
					d=y;
				}
				t++;
				kk=next(kk);
			}
			if(!a||!d) continue;
			ans=max(p[a]+p[b]+p[c]+p[d],ans);
		}
	}
	cout<<ans<<endl;
	return 0;
}
2023/11/26 10:29
加载中...