70 wa求调 第三大的写法
查看原帖
70 wa求调 第三大的写法
542905
WannaYellow楼主2022/11/3 07:24
#include <bits/stdc++.h>
using std::cin;
using std::cout;
using std::endl;
std::basic_string<int> G[2505];
long long N, M, K, val[2505], dis[2505][2505], ans;

struct Tmp {
	long long val;
	int pre;
	Tmp(long long x = 0, int y = 0) {
		val = x, pre = y;
	}
} ansmax[2505][3];
std::queue<int> q;
bool flag[2505];
void init(int x) {
	dis[x][x] = 0;
	flag[x] = 1;
	q.push(x);
	while (!q.empty()) {
		//std::clog<<q.size()<<endl;
		int u = q.front();
		q.pop();
		for (auto v : G[u]) {
		    if (flag[v])continue;
			q.push(v);
			dis[x][v] = dis[x][u] + 1;
			flag[v] = 1;
		}
	}
	return;
}

void Trimax(Tmp &x, Tmp &y, Tmp &w, Tmp z) {
	if (z.val > x.val)	w = y, y = x, x = z;
	else if (z.val > y.val)	w = y, y = z;
	else if (z.val>w.val) w = z;
}

void update(int x, int y, int z) {
	long long cmpval = val[y] + val[z];
	Trimax(ansmax[x][0], ansmax[x][1], ansmax[x][2], Tmp(cmpval, y));
}

bool check(int x1, int y1, int x2, int y2) {
	if (x1 == x2 || x1 == y2)return false;
	else if (y1 == x2 || y1 == y2)return false;
	return true;
}

long long calc(int x, int y) {
	long long re = 0;
	for (int i = 0; i < 3; i++) {
		if (ansmax[x][i].val == 0)	continue;
		for (int j = 0; j < 3; j++) {
			if (ansmax[y][j].val == 0)	continue;
			if (check(x, ansmax[x][i].pre, y, ansmax[y][j].pre))
				re = std::max(re, ansmax[x][i].val + ansmax[y][j].val);
		}
	}
	return re;
}
int main() {
	//freopen("holiday.in","r",stdin);
	//freopen("holiday.out","w",stdout);
	std::ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	cin >> N >> M >> K;
	for (int i = 2; i <= N; i++) {
		cin >> val[i];
	}
	for (int i = 1; i <= M; i++) {
		int u, v;
		cin >> u >> v;
		G[u] += v;
		G[v] += u;
	}
	for (int i = 1; i <= N; i++) {
		for (int j = 1; j <= N; j++)
			flag[j] = 0;
		init(i);
	}
//	for(int i=1;i<=N;i++){
//		for(int j=1;j<=N;j++){
//			cout<<dis[i][j]<<" ";
//		}
//		cout<<endl;
//	}
	for (int i = 2; i <= N; i++) {
		if (dis[1][i] > K + 1)continue;
		for (int j = 2; j <= N; j++) {
			if (dis[i][j] > K + 1 || i == j)continue;
			update(j, i, j);
		}
	}
	for (int i = 2; i <= N; i++) {
		if (ansmax[i][0].val == 0)continue;
		for (int j = 2; j <= N; j++) {
			if (i == j || ansmax[j][0].val == 0 || dis[i][j] > K + 1)continue;
			ans = std::max(ans, calc(i, j));
		}
	}
//	for(int i=2;i<=N;i++){
//		cout<<i<<" "<<ansmax[i][0].pre<<" "<<ansmax[i][0].val<<endl;
//		cout<<i<<" "<<ansmax[i][1].pre<<" "<<ansmax[i][1].val<<endl;
//	}
	cout << ans << endl;
	return 0;
}
2022/11/3 07:24
加载中...