100pts,但是民间数据最后一个点TLE
查看原帖
100pts,但是民间数据最后一个点TLE
482856
TigerNick楼主2023/8/10 22:05
#include <bits/stdc++.h>
#define INF LONG_LONG_MAX
#define int long long
#define fi first
#define se second
#define MAXN 2510
using namespace std;
int n,m,k,v[MAXN],ans,vis[MAXN],f[MAXN][MAXN],u,vv;
bool cmp(pair<int,int> a,pair<int,int> b)
{
	return a.fi>b.fi;
}
set< pair<int,int> , greater< pair<int,int> > > s[MAXN];
set< pair<int,int> , greater< pair<int,int> > >::iterator it;
vector<int> p[MAXN];
queue< pair<int,int> >Q;
void bfs(int x,int d,int a)
{
	Q.push({x,d});
	vis[x]=1;
	while(!Q.empty())
	{
		int u=Q.front().fi,d=Q.front().se;
		Q.pop();
		f[x][u]=f[u][x]=1;
		if(d>=0&&f[u][1]) s[x].insert({v[u],u});
		if(s[x].size()>3) s[x].erase(*((it=s[x].end())--));
		if(d==k) continue;
		for(int i=0;i<p[u].size();i++)
		{
			int v=p[u][i];
			if(vis[v]) continue;
			vis[v]=1;
			Q.push({v,d+1});
		}
	}
}
signed main()
{
	ios::sync_with_stdio(0);
	//freopen("holiday3.in","r",stdin);
	//freopen("holiday.out","w",stdout);
	cin>>n>>m>>k;
	for(int i=2;i<=n;i++) cin>>v[i];
	for(int i=1;i<=m;i++)
	{
		cin>>u>>vv; 
		p[u].push_back(vv);
		p[vv].push_back(u);
	}
	for(int i=1;i<=n;i++)
	{
		memset(vis,0,sizeof(vis));
		bfs(i,-1,i);
	}
	//for(int i=1;i<=n;i++,cout<<endl)
		//for(int j=1;j<=n;j++)
			//cout<<f[i][j]<<" ";
	/*for(int i=1;i<=n;i++)
	{
		cout<<i<<" ::: "<<'\n';
		for(auto it=s[i].begin();it!=s[i].end();it++)
			cout<<(*it).se<<" "<<(*it).fi<<endl;
	}*/
	for(int B=2;B<=n;B++)
		for(int C=2;C<=n;C++)
		{
			if(B==C||!f[B][C]) continue;
			int t=1;
			for(auto it=s[B].begin();t<=3&&it!=s[B].end();t++,it++)
			{
				int t2=1;
				for(auto it2=s[C].begin();t2<=3&&it2!=s[C].end();t2++,it2++)
				{
					int A=(*it).se;
					int D=(*it2).se;
					if(A!=D&&A!=B&&A!=C&&D!=B&&D!=C&&A!=1&&D!=1)
						ans=max(ans,v[B]+v[C]+v[A]+v[D]);
				}
			}
		}
	cout<<ans;
	return 0;
}

2023/8/10 22:05
加载中...