S组 T1 记录最大次大第三大 WA了#11 #17
查看原帖
S组 T1 记录最大次大第三大 WA了#11 #17
535224
nyllsom楼主2022/10/29 23:00

RT

其实考场代码第一个判断的第三个分支的else忘记写了,但是加上之后那两个点还是WA

#include <bits/stdc++.h>
using namespace std;

#define int long long
typedef long long ll;
inline ll read() {
	ll x = 0, f = 1; char c = getchar();
	while (!isdigit(c)) (c == '-') && (f = -1), c = getchar();
	while (isdigit(c)) x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();
	return f * x;
} 

const ll inf = 10000000000000000;

#define m1 aaaaaa 
#define m2 bbbbbb
#define m3 cccccc

int n, m, k;
ll val[3010];
int tot, hd[3010], to[50010], nxt[50010];
void addedge(int u, int v) { tot++; nxt[tot] = hd[u]; to[tot] = v; hd[u] = tot; }
queue<int> q;
int d[3010][3010];
int m1[3010], m2[3010], m3[3010];
int vis[3010];

void bfs(int S) {
	for (int i = 1; i <= n; i++) d[S][i] = inf, vis[i] = 0;
	d[S][S] = 0;
	vis[S] = 1;
	q.push(S);
	while (!q.empty()) {
		int u = q.front();
		q.pop();
		for (int i = hd[u]; i; i = nxt[i]) {
			int v = to[i];
			if (vis[v]) continue;
			d[S][v] = d[S][u] + 1;
			vis[v] = 1;
			q.push(v);
		}
	}
}

signed main() {
//	freopen("holiday.in", "r", stdin);
//	freopen("holiday.out", "w", stdout);
//	freopen("holiday3.in", "r", stdin);
//	freopen("out.out", "w", stdout);
	n = read(), m = read(), k = read();
	for (int i = 2; i <= n; i++) {
		val[i] = read();		
	}
	for (int i = 1; i <= m; i++) {
		int u = read(), v = read();
		addedge(u, v); addedge(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("d[%lld][%lld]:%lld\n", i, j, d[i][j]);
//		}
//	}
	
	for (int u = 2; u <= n; u++) {
		if (d[1][u] <= 2 * k + 2) {
			for (int v = 2; v <= n; v++) {
				if (u == v) continue;
				if (d[1][v] <= k + 1 && d[v][u] <= k + 1) {
					if (val[v] > val[m1[u]]) {
						m3[u] = m2[u];
						m2[u] = m1[u];
						m1[u] = v;
					}
					else {
						if (val[v] > val[m2[u]]) {
							m3[u] = m2[u];
							m2[u] = v;
						}
						else {
							if (val[v] > val[m3[u]]) {
								m3[u] = v;
							}
						}
					}
				}
			}
		}
	}
	
//	for (int i = 1; i <= n; i++) {
//		printf("%d:::::::m1:%d m2:%d m3:%d\n", m1[i], m2[i], m3[i]);
//	}
	
	ll ans = 0;
	for (int u = 2; u <= n; u++) {
		for (int v = u + 1; v <= n; v++) {
			if (d[1][u] <= 2 * k + 2 && d[1][v] <= 2 * k + 2 && d[u][v] <= k + 1) {
				if (m1[u] == 0 || m1[v] == 0) continue;
				ll calc = val[u] + val[v];
				if (m1[u] == v) {
					if (m1[v] == u) {
						if (m2[u] == m2[v]) {
							calc += val[m2[u]] + max(val[m3[u]], val[m3[v]]);
						}
						else {
							calc += val[m2[u]] + val[m2[v]];
						}
					}
					else if (m2[v] == u) {
						if (m2[u] == m1[v]) {
							calc += val[m2[u]] + max(val[m3[u]], val[m3[v]]);
						}
						else {
							calc += val[m2[u]] + val[m1[v]];
						}
					}
					else {
						if (m2[u] == m1[v]) {
							calc += val[m2[u]] + max(val[m3[u]], val[m2[v]]);
						}
						else {
						    calc += val[m2[u]] + val[m1[v]];
						}
					}
				}
				else if (m2[u] == v) {
					if (m1[v] == u) {
						if (m1[u] == m2[v]) {
							calc += val[m1[u]] + max(val[m3[u]], val[m3[v]]);
						}
						else {
							calc += val[m1[u]] + val[m2[v]];
						}
					}
					else if (m2[v] == u) {
						if (m1[u] == m1[v]) {
							calc += val[m1[u]] + max(val[m3[u]], val[m3[v]]);
						}
						else {
							calc += val[m1[u]] + val[m1[v]];
						}
					}
					else {
						if (m1[u] == m1[v]) {
							calc += val[m1[u]] + max(val[m3[u]], val[m2[v]]);
						}
						else {
							calc += val[m1[u]] + val[m1[v]];
						}
					}
				}
				else {
					if (m1[v] == u) {
						if (m1[u] == m2[v]) {
							calc += val[m1[u]] + max(val[m2[u]], val[m3[v]]);
						}
						else {
							calc += val[m1[u]] + val[m2[v]];
						}
					}
					else if (m2[v] == u) {
						if (m1[u] == m1[v]) {
							calc += val[m1[u]] + max(val[m2[u]], val[m3[v]]);
						}
						else {
							calc += val[m1[u]] + val[m1[v]];
						}
					}
					else {
						if (m1[u] == m1[v]) {
							calc += val[m1[u]] + max(val[m2[u]], val[m2[v]]);
						}
						else {
							calc += val[m1[u]] + val[m1[v]];
						}
					}
				}
				ans = max(ans, calc);
			}
		}
	}
	cout << ans << endl;
	return 0;
}
2022/10/29 23:00
加载中...