65ptsWA求助
查看原帖
65ptsWA求助
496021
aioilit楼主2023/10/12 13:50
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int MAXN=2505,MAXM=10005;
int n,m,k;
int u,v;
ll p[MAXN];
int tot,head[MAXN],to[MAXM<<1],nxt[MAXM<<1];
void link(int u,int v)
{
	to[++tot]=v;
	nxt[tot]=head[u];
	head[u]=tot;
}
int dis[MAXN],flag[MAXN];
int q[MAXN],l,r;
int m1[MAXN],m2[MAXN],m3[MAXN];
int ok[MAXN][MAXN];
void bfs(int st)
{
	for(int i=1;i<=n;i++)
		dis[i]=k+1,flag[i]=0;
	dis[st]=0; flag[st]=1;
	l=r=1; q[r]=st;
	while(l<=r)
	{
		int tmp=q[l++];
		if(dis[tmp]==k) continue;
		for(int i=head[tmp];i;i=nxt[i])
		{
			int it=to[i];
			if(!flag[it])
			{
				flag[it]=1;
				dis[it]=dis[tmp]+1;
				q[++r]=it;
			}
		} 
	}
	for(int i=1;i<=n;i++)
		if(dis[i]<=k)
		{
			ok[st][i]=1;
			if(i==1 || i==st) continue;
			if(p[i]>p[m1[st]])
			{
				m3[st]=m2[st]; m2[st]=m1[st];
				m1[st]=i;
			}
			else if(p[i]>p[m2[st]])
				m3[st]=m2[st],m2[st]=i;
			else if(p[i]>p[m3[st]]) m3[st]=i;
		}
}
ll ans;
void chk(int x,int y,int z,int w)
{
	if(!x || !w || x==z || x==w || y==w || !ok[w][1] || !ok[x][1]) return ;
	ans=max(ans,p[x]+p[y]+p[z]+p[w]);
}
int main()
{
	scanf("%d%d%d",&n,&m,&k);
	++k;
	for(int i=2;i<=n;i++) 
		scanf("%lld",&p[i]);
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d",&u,&v);
		link(u,v); link(v,u);
	}	
	for(int i=2;i<=n;i++)
		bfs(i);
	for(int i=2;i<n;i++)
		for(int j=i+1;j<=n;j++)
			if(ok[i][j])
			{
				chk(m1[i],i,j,m1[j]);
				chk(m1[i],i,j,m2[j]);
				chk(m1[i],i,j,m3[j]);
				chk(m2[i],i,j,m1[j]);
				chk(m2[i],i,j,m2[j]);
				chk(m2[i],i,j,m3[j]);
				chk(m3[i],i,j,m1[j]);
				chk(m3[i],i,j,m2[j]);
				chk(m3[i],i,j,m3[j]);
			}
	printf("%lld",ans);
	return 0;
} 
2023/10/12 13:50
加载中...