CCF数据 WA 90pts 求助
查看原帖
CCF数据 WA 90pts 求助
490744
LincW楼主2022/11/9 10:10
#include<bits/stdc++.h>

using namespace std;

typedef unsigned long long ull;

const int N=2500;

int n,m,k;

vector<int> adj[N+5];

bool vis[N+5][N+5]={0};

ull v[N+5];
ull vd[N+5]={0};
int vdx[N+5]={0};
ull vd2[N+5]={0};
int vdx2[N+5]={0};
ull cm=0;

void bfs(int s,int f,int t)
{
	queue<int> q;
	if(t>k) return;
	
	for(int i=0;i<adj[s].size();++i)
	{
		if(!vis[f][adj[s][i]])
		{
			vis[f][adj[s][i]]=1;
			q.push(adj[s][i]);
		}
	}
	
	while(!q.empty())
	{
		bfs(q.front(),f,t+1);
		q.pop();
	}
}

int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	
	cin>>n>>m>>k;
	for(int i=2;i<=n;++i)
	{
		cin>>v[i];
	}
	v[1]=0;
	
	for(int i=1;i<=m;++i)
	{
		int x,y;
		cin>>x>>y;
		adj[x].push_back(y);
		adj[y].push_back(x);
	}
	
	for(int i=1;i<=n;++i)
	{
		vis[i][i]=1;
		bfs(i,i,0);
	}
	
	for(int i=1;i<=n;++i)
	{
		vis[i][i]=0;
	}
	
	for(int i=2;i<=n;++i)
	{
		if(!vis[1][i]) continue;
		for(int j=2;j<=n;++j)
		{
			if(!vis[i][j]) continue;
			if(v[i]+v[j]>vd[j])
			{
				vd2[j]=vd[j];
				vdx2[j]=vdx[j];
				vd[j]=v[i]+v[j];
				vdx[j]=i;
			}
			else if(v[i]+v[j]>vd2[j])
			{
				vd2[j]=v[i]+v[j];
				vdx2[j]=i;
			}
		}
	}
	
//	for(int i=2;i<=n;++i)
//	{
//		cout<<vd[i]<<": "<<vdx[i]<<"==="<<vd2[i]<<": "<<vdx2[i]<<endl;
//	}
	
	for(int i=2;i<=n;++i)
	{
		//if(!vis[1][i]) continue;
		for(int j=2;j<=n;++j)
		{
			//cout<<i<<" "<<j<<" "<<vis[i][j]<<endl;
			if(!vis[i][j]) continue;
			if(vdx[i]!=vdx[j] && i!=vdx[j] && j!=vdx[i])
			{
				if(vd[i]+vd[j]>cm)
				{
					cm=vd[i]+vd[j];
					
					//cout<<"1: "<<i<<" "<<j<<" "<<cm<<endl;
				}
			}
			else
			{
				if(vdx2[i]!=0 && vdx2[j]!=0 && vdx2[i]!=vdx[j] && i!=vdx[j] && j!=vdx2[i] && vdx[i]!=vdx2[j] && i!=vdx2[j] && j!=vdx[i])
				{
					if(max(vd2[i]+vd[j],vd[i]+vd2[j])>cm)
					{
						cm=max(vd2[i]+vd[j],vd[i]+vd2[j]);
					}
				}
				else if(vdx2[i]!=0 && vdx2[i]!=vdx[j] && i!=vdx[j] && j!=vdx2[i])
				{
					if(vd2[i]+vd[j]>cm)
					{
						cm=vd2[i]+vd[j];
					}
				}
				else if(vdx2[j]!=0 && vdx[i]!=vdx2[j] && i!=vdx2[j] && j!=vdx[i])
				{
					if(vd[i]+vd2[j]>cm)
					{
						cm=vd[i]+vd2[j];
					}
				}
			}
		}
	}
	
	cout<<cm<<'\n';
	
	return 0;
}

https://www.luogu.com.cn/record/93335968

2022/11/9 10:10
加载中...