求MLE之处
查看原帖
求MLE之处
481337
Pratty楼主2024/10/12 17:03
#include <bits/stdc++.h>
using namespace std;
const int N = 2501;
int n, m, k;
int a[N], x, y;
long long ans;
vector<int> vt[N];
struct node {
	int u;//当前是在哪个点
	int dis;//走了几步(转车数-1)
	long long cod;//得分
	int num;//去了几个点了
	int Num[5];//哪几个点
};
queue<node> q;
int main() {
	scanf("%d%d%d", &n, &m, &k);
	for (int i = 2; i <= n; i++) {
		scanf("%d", &a[i]);
	}
	for (int i = 1; i <= m; i++) {
		scanf("%d%d", &x, &y);
		vt[x].push_back(y);
		vt[y].push_back(x);
	}
	node t;
	t.u = 1;
	t.dis = 0;
	t.cod = 0;
	t.num = 0;
	t.Num[1] = t.Num[2] = t.Num[3] = t.Num[4] = 0;
	q.push(t);
	while(!q.empty()) {
		node f = q.front();
		q.pop();
		if (f.num == 4 && f.u == 1 && f.dis <= k + 1) {
			ans = max(ans, f.cod);
			continue;
		}
		if (f.dis > k) {//必须来u这个景点
			if (f.num >= 4) continue;
			if (f.u == 1) continue;
			if (f.Num[1] == f.u || f.Num[2] == f.u || f.Num[3] == f.u || f.Num[4] == f.u) continue;
			f.num++;
			f.Num[f.num] = f.u;
			f.cod += 1LL * a[f.u];
			f.dis = 0;
			q.push(f);
			continue;
		}
		//来u这个景点
		if (f.num < 4 && f.u != 1) {
			if (!(f.Num[1] == f.u || f.Num[2] == f.u || f.Num[3] == f.u || f.Num[4] == f.u)) {
				node t;
				t.u = f.u;
				t.dis = 0;
				t.cod = f.cod + 1LL * a[f.u];
				t.num = f.num + 1;
				t.Num[1] = f.Num[1];
				t.Num[2] = f.Num[2];
				t.Num[3] = f.Num[3];
				t.Num[4] = f.Num[4];
				t.Num[f.num + 1] = f.u;
				q.push(t);
			}
		}
		//不来u这个景点
		for (int i = 0; i < (int)vt[f.u].size(); i++) {
			node t;
			t.u = vt[f.u][i];
			t.dis = f.dis + 1;
			t.cod = f.cod;
			t.num = f.num;
			t.Num[1] = f.Num[1];
			t.Num[2] = f.Num[2];
			t.Num[3] = f.Num[3];
			t.Num[4] = f.Num[4];
			q.push(t);
		}
	}
	printf("%lld", ans);
	return 0;
}
2024/10/12 17:03
加载中...