S组T1求助
  • 板块学术版
  • 楼主Ptilopsis_
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/10/29 21:34
  • 上次更新2023/10/27 05:02:55
查看原帖
S组T1求助
524994
Ptilopsis_楼主2022/10/29 21:34

疫情考生,大样例一个没过,洛谷85

#include<bits/stdc++.h>
using namespace std;
long long n,m,k,w[3002],vis[3002],b[3002][3],ans;
bool mark[3002];
vector<int> a[3002],in[3002];
void dfs(int u,int f,int step)
{
	if(vis[u]==f&&step!=0)
		return;
	vis[u]=f,in[f].push_back(u);
	if(f==1)
		mark[u]=true;
	if(mark[u])
	{
		if(w[u]>w[b[f][2]])
			b[f][2]=u;
		if(w[b[f][2]]>w[b[f][1]])
			swap(b[f][2],b[f][1]);
		if(w[b[f][1]]>w[b[f][0]])
			swap(b[f][1],b[f][0]);
	}
	if(step==k)
		return;
	for(int i=0;i<a[u].size();i++)
		dfs(a[u][i],f,step+1);
}
int main()
{
	cin>>n>>m>>k;
	k++;
	for(int i=2;i<=n;i++)
		cin>>w[i];
	int u,v;	
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d",&u,&v);
		a[u].push_back(v);
		a[v].push_back(u);
	}
	for(int i=1;i<=n;i++)
		vis[i]=i,dfs(i,i,0);
	for(int i=2;i<=n;i++)
		for(int j=0;j<in[i].size();j++)
		{
			int v=in[i][j];
			for(int k=0;k<3;k++)
				for(int l=0;l<3;l++)
					if(i!=v&&i!=b[i][k]&&i!=b[v][l]&&v!=b[i][k]&&v!=b[v][l]&&b[i][k]!=b[v][l])
						ans=max(ans,w[i]+w[v]+w[b[i][k]]+w[b[v][l]]);
		}
	cout<<ans;
}
2022/10/29 21:34
加载中...