80分求调
查看原帖
80分求调
482610
Mortidesperatslav楼主2023/9/14 20:45
#include<bits/stdc++.h>
using namespace std;
int h[100001], nxt[500001], val[500001], zd[500001], cnt = 0;
int n, m, s, k;
long long dis[100001];
bool inq[100001];
int q[1000001], f, e;
long long pval[100001], pval2[100005], ans = 0;
int vis[5] = {};
bool ed[10001][10001];
int zhuan[10001][10001];
vector<int>ljb[10001];
void addedge(int a, int b, int c) {
	cnt++;
	val[cnt] = c, zd[cnt] = b, nxt[cnt] = 0;
	nxt[cnt] = h[a];
	h[a] = cnt;
}
void dfs(int i, int dep, long long valu, int vis[5]) {
	register int summmm = 0;
	for (register int qwq = dep; qwq < 4; qwq++)summmm += pval2[qwq];
	if (summmm + valu < ans)return;
	for (register int qaq = 0; qaq <= 5; qaq++)if (i == vis[qaq])return;
	vis[dep] = i;
	if (dep == 4) {
		for (register int p = 0; p < ljb[i].size(); p++)
			if (ljb[i][p] == 1) {
				ans = max(ans, valu);
			}
		return;
	}
	for (register int p = 0; p < ljb[i].size(); p++) {
		dfs(ljb[i][p], dep + 1, valu + pval[ljb[i][p]], vis);
	}
}
bool cmp(int a, int b) {
	return a > b;
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	memset(zhuan, -1, sizeof(zhuan));
	cin >> n >> m >> k;
	for (register int i = 2; i <= n; i++) {
		cin >> pval[i];
		pval2[i] = pval[i];
	}
	for (register int i = 1; i <= m; i++) {
		register int a, b;
		cin >> a >> b;
		addedge(a, b, 1);
		addedge(b, a, 1);
		ed[a][b] = 1;
		ed[b][a] = 1;
		zhuan[a][b] = 0;
		zhuan[b][a] = 0;
	}
	if (k == 0 && n <= 20) {
		unsigned long long res = 0;
		for (register int a = 2; a <= n; a++) {
			for (register int b = 2; b <= n; b++) {
				if (b == a)continue;
				for (register int c = 2; c <= n; c++) {
					if (c == a || c == b)continue;
					for (register int d = 2; d <= n; d++) {
						if (d == a || d == b || d == c)continue;
						if (ed[1][a] == 1) {
							if (ed[a][b] == 1) {
								if (ed[b][c] == 1) {
									if (ed[c][d] == 1) {
										if (ed[d][1] == 1) {
											if (pval[a] + pval[b] + pval[c] + pval[d] > res)res = pval[a] + pval[b] + pval[c] + pval[d];
										}
									}
								}
							}
						}
					}
				}
			}
		}
		cout << res;
	} else if (n > 20) {
		for (register int s = 1; s <= n; s++) {
			memset(dis, -1, sizeof(dis));
			memset(inq, 0, sizeof(inq));
			dis[s] = 0, inq[s] = 1;
			q[1] = s, f = 1, e = 1;
			while (f <= e) {
				register int u = q[f++];
				for (register int p = h[u]; p; p = nxt[p]) {
					register long long v = zd[p], c = val[p];
					if (dis[v] == -1 || dis[v] > dis[u] + c) {
						dis[v] = dis[u] + c;
						if (inq[v] == 0)q[++e] = v, inq[v] = 1;
					}
				}
			}
			for (register int i = 1; i <= n; i++) {
				if (i == s || dis[i] > k + 1 || dis[i] == -1)continue;
				ljb[s].push_back(i);
			}
		}
		sort(pval2 + 1, pval2 + n + 1, cmp);
		dfs(1, 0, 0, vis);
		cout << ans;
	} else {
		for (register int a = 1; a <= n; a++) {
			for (register int b = 1; b <= n; b++) {
				if (b == a)continue;
				for (register int c = 1; c <= n; c++) {
					if (c == a || c == b)continue;
					if (ed[a][b] && ed[b][c]) {
						ed[a][c] = 1;
						if (zhuan[a][c] == -1 || zhuan[a][b] + zhuan[b][c] + 1 < zhuan[a][c])zhuan[a][c] = zhuan[a][b] + zhuan[b][c] + 1;
					}
				}
			}
		}
		unsigned long long res = 0;
		for (register int a = 2; a <= n; a++) {
			for (register int b = 2; b <= n; b++) {
				if (b == a)continue;
				for (register int c = 2; c <= n; c++) {
					if (c == a || c == b)continue;
					for (register int d = 2; d <= n; d++) {
						if (d == a || d == b || d == c)continue;
						if (ed[1][a] == 1) {
							if (ed[a][b] == 1) {
								if (ed[b][c] == 1) {
									if (ed[c][d] == 1) {
										if (ed[d][1] == 1) {
											if (zhuan[1][a] > k || zhuan[a][b] > k || zhuan[b][c] > k || zhuan[c][d] > k || zhuan[d][1] > k)continue;
											if (pval[a] + pval[b] + pval[c] + pval[d] > res) {
												res = pval[a] + pval[b] + pval[c] + pval[d];
												//cout<<a<<" "<<b<<" "<<c<<" "<<d<<" "<<res<<"\n";
											}
										}
									}
								}
							}
						}
					}
				}
			}
		}
		cout << res;
	}
}
2023/9/14 20:45
加载中...