求助
查看原帖
求助
250493
sssaberrrr楼主2022/11/25 09:21

思路跟正解一样(应该),民间数据90(10月30日),官方数据45,直接爆炸

#include<bits/stdc++.h>
#define int long long
const int N = 3005;
const int M = 100005;

using namespace std;

int n, m, k;
int v[N];

int head[N], cnt;

struct stu{
	int u, v;
	int next;
} edge[M];

void add(int u, int v)
{
	edge[++cnt]=(stu){u, v, head[u]};
	head[u]=cnt;
}

int a[N][N];
int f[N][N];
queue<int> que;
bool vis[N];

void bfs(int s)
{
	while(que.size()) que.pop();
	memset(vis, 0, sizeof(vis));
	que.push(s);vis[s]=1;
	while(que.size())
	{
		int u=que.front();
		que.pop();
		for(int i=head[u]; i; i=edge[i].next)
		{
			int v=edge[i].v;
			if(vis[v]) continue;
			vis[v]=1, que.push(v), f[s][v]=f[s][u]+1;
		}
	}
}

int b[N], c[N], d[N], p[N], q[N], r[N];
int ans;

signed main()
{
	// freopen("holiday.in", "r", stdin);
	// freopen("holiday.out", "w", stdout);
	scanf("%lld%lld%lld", &n, &m, &k);
	k++;
	for(int i=2; i<=n; i++) scanf("%lld", &v[i]);
	memset(a, 0x3f, sizeof(a));
	for(int i=1; i<=n; i++) a[i][i]=0;
	for(int i=1; i<=m; i++)
	{
		int u, v;
		scanf("%lld%lld", &u, &v);
		a[u][v]=a[v][u]=1;
		add(u, v), add(v, u);
	}
	for(int i=1; i<=n; i++) bfs(i);
//	for(int i=1; i<=n; i++)
//	{
//		for(int j=1; j<=n; j++)
//			printf("%lld ", f[i][j]==0x3f3f3f3f?-1:f[i][j]);
//		printf("\n");
//	}
	for(int i=2; i<=n; i++)
		for(int j=2; j<=n; j++)
		{
			if(i==j) continue;
			if(f[1][i]<=k&&f[i][j]<=k)
			{
				int val=v[i]+v[j];
				if(b[j]<=val) d[j]=c[j], c[j]=b[j], b[j]=val, r[j]=q[j], q[j]=p[j], p[j]=i;
				else if(c[j]<val) d[j]=c[j], c[j]=val, r[j]=q[j], q[j]=i;
				else if(d[j]<val) d[j]=val, r[j]=i;
			}
		}
//	for(int i=1; i<=n; i++)
//		printf("%lld %lld  %lld %lld  %lld %lld\n", b[i], p[i], c[i], q[i], d[i], r[i]);
	
	for(int i=1; i<=n; i++)
		for(int j=i+1; j<=n; j++)
			if(f[i][j]<=k)
			{
				if(p[i]!=p[j]&&p[i]!=j&&i!=p[j]) ans=max(ans, b[i]+b[j]);
				if(p[i]!=q[j]&&p[i]!=j&&i!=q[j]) ans=max(ans, b[i]+c[j]);
				if(p[i]!=r[j]&&p[i]!=j&&i!=r[j]) ans=max(ans, b[i]+d[j]);
				if(q[i]!=p[j]&&q[i]!=j&&i!=p[j]) ans=max(ans, c[i]+b[j]);
				if(q[i]!=q[j]&&q[i]!=j&&i!=q[j]) ans=max(ans, c[i]+c[j]);
				if(q[i]!=r[j]&&q[i]!=j&&i!=r[j]) ans=max(ans, c[i]+d[j]);
				if(r[i]!=p[j]&&r[i]!=j&&i!=p[j]) ans=max(ans, d[i]+b[j]);
				if(r[i]!=q[j]&&r[i]!=j&&i!=q[j]) ans=max(ans, d[i]+c[j]);
				if(r[i]!=r[j]&&r[i]!=j&&i!=r[j]) ans=max(ans, d[i]+d[j]);
			}
	
	printf("%lld", ans);
	
	return 0;
}
2022/11/25 09:21
加载中...