灌水区人多 , 求求神犇
  • 板块灌水区
  • 楼主ikun_fjh
  • 当前回复4
  • 已保存回复4
  • 发布时间2023/10/19 20:08
  • 上次更新2023/11/2 12:44:21
查看原帖
灌水区人多 , 求求神犇
315619
ikun_fjh楼主2023/10/19 20:08
#include <bits/stdc++.h>
using namespace std;

const int N = 2505;

int n , m , k;
long long a[N];
vector <int> g[N];
int x , y;
int dis[N][N];//dis[i][j]用于记录i、j之间最短路径 
bool vis[N] , f[N][N];//vis[i]记录点i是否被访问过 , f[i][j]记录i到j是否符合 
long long val[N][3];
long long ans;
int dian[N][3];

void buble_get_value(int pos ,long long value , int add)
{
	if (value > val[pos][0])
	{
		val[pos][2] = val[pos][1];
		val[pos][1] = val[pos][0];
		val[pos][0] = value;
		dian[pos][2] = dian[pos][1];
		dian[pos][1] = dian[pos][0];
		dian[pos][0] = add;
	}
	else if(value > val[pos][1])
	{
		val[pos][2] = val[pos][1];
		val[pos][1] = value;
		dian[pos][2] = dian[pos][1];
		dian[pos][1] = add;
	}
	else if(value > val[pos][2])
	{
		val[pos][2] = value;
		dian[pos][2] = add;
	}
}

void bfs(int sx)
{
	queue <int> q;
	while (!q.empty())	q.pop();
	q.push(sx);
	vis[sx] = true;
	dis[sx][sx] = 0;
	while (!q.empty())
	{
		int x = q.front();
		q.pop();
		for (int i = 0 ; i < g[x].size() ; i++)
		{
			int u = g[x][i];
			if(vis[u])	continue;
			q.push(u);
			vis[u] = true;
			dis[sx][u] = dis[sx][x] + 1;
		}
	}
}

int main()
{
	//freopen("holiday.in" , "r" , stdin);
	//freopen("holiday.out" , "w" , stdout);
	
	memset(dis , 0x3f , sizeof(dis));
	memset(f , false , sizeof(f));
	
	scanf("%d%d%d" , &n , &m , &k);
	
	for (int i = 2 ; i <= n ; i++)
	{
		scanf("%lld" , a + i);
	}
	while (m--)
	{
		scanf("%d%d" , &x , &y);
		g[x].push_back(y);
		g[y].push_back(x);
	}
	
	//bfs找最短路
	for (int i = 1 ; i <= n ; i++)	
	{
		memset(vis , false , sizeof(vis));
		bfs(i);
	}
	
	for (int i = 1 ; i <= n ; i++)
	{
		for (int j = 1 ; j <= n ; j++)
		{
			if (dis[i][j] - 1 <= k)
			{
				f[i][j] = true;
				f[j][i] = true;
			}
		}
	}
	
	for (int i = 2 ; i <= n ; i++)
	{
		for (int j = 2 ; j <= n ; j++)
		{
			long long value = a[i] + a[j];
			if (i != j && f[1][i] && f[i][j])
			{
				buble_get_value(j , value , i);
			}
		}
	}
	//1-A-B  C-D-1
	for (int i = 2 ; i <= n ; i++)
	{
		for (int j = 2 ; j <= n ; j++)
		{
			for (int ik = 0 ; ik < 3 ; ik++)
			{
				bool flag = false;
				for (int jk = 0 ; jk < 3 ; jk++)
				{
					if (ans < val[j][jk] + val[i][ik] && f[i][j] && i != j && dian[i][ik] != dian[j][jk] && dian[i][ik] != j && dian[j][jk] != i)
					{
						ans = val[j][jk] + val[i][ik];
					}
				}
			}
		}
	}
	printf("%lld" , ans);
	return 0; 
}

去年S的T1 , WA了Sub1的#17 , dalao求调

2023/10/19 20:08
加载中...