95 pts求调,大常数n^2,sub0最后一点tle
查看原帖
95 pts求调,大常数n^2,sub0最后一点tle
637220
wooaoo楼主2025/2/8 14:16
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m,k,score[2505],x,y,ans;
vector<ll>v[2505],v2[2505];
bitset<2505> ok[2505];
bitset<2505> vis;
set<pair<ll,ll> >s[2505];
struct node
{
	ll x,d;
	node(ll a,ll b)
	{
		x=a,d=b;
	}
};
void bfs(ll x)
{
	queue<node>q=queue<node>();
	vis.reset();
	q.push(node(x,0));
	while(!q.empty())
	{
		node tmp=q.front();
		q.pop();
		vis[tmp.x]=1;
		if(tmp.d-1<=k)
		ok[x][tmp.x]=1;
		else break;
		for(int i=0;i<v[tmp.x].size();i++)
		if(!vis[v[tmp.x][i]])q.push(node(v[tmp.x][i],tmp.d+1));
	}
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m>>k;
	for(int i=2;i<=n;i++)
	cin>>score[i];
	for(int i=1;i<=m;i++)
	cin>>x>>y,v[x].push_back(y),v[y].push_back(x);
	for(ll i=1;i<=n;i++)
	{
		bfs(i);
		ok[i][i]=0;
	}
	for(int i=2;i<=n;i++)
	{
		for(int j=2;j<=n;j++)
		{
			if(j==i)continue;
			if(ok[i][j]&&ok[1][j])s[i].insert(make_pair(score[j],j));
			if(s[i].size()>3)s[i].erase(s[i].begin());
		}
	}
	for(int b=2;b<=n;b++)
	for(int c=b+1;c<=n;c++)
	{
		if((!ok[b][c]))continue;
		for(auto a=s[b].begin();a!=s[b].end();a++)
		{
			if((*a).second==b||(*a).second==c)continue;
			for(auto d=s[c].begin();d!=s[c].end();d++)
		{
			if((*d).second==b||(*d).second==c||(*d).second==(*a).second)continue;
			ans=max(ans,score[b]+score[c]+score[(*a).second]+score[(*d).second]);
		}
		}
	}
	cout<<ans;
}
2025/2/8 14:16
加载中...