#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int inf = 999999999;
int cmax, n, sp, m;
int minNeed = inf, minBack = inf;
int e[510][510], dis[510], weight[510];
bool visit[510];
vector<int> pre[510], path, temppath;
void dfs(int v) {
	temppath.push_back(v);
	if (v == 0) {
		int need = 0, back = 0;
		for (int i = temppath.size()-1; i >=0; i--) {
			if (weight[i] > 0) {
				back += weight[i];
			}
			else {
				if (back > (0 - weight[i])) {
					back += weight[i];
				}
				else {
					need += (0 - weight[i]) - back;
					back = 0;
				}
			}
		}
		if (back < minBack) {
			minBack = back;
			minNeed = need;
			path = temppath;
		}
		else if(back==minBack&&need<minNeed){
			minNeed = need;
			path = temppath;
		}
		return;
	}
	for (int i = 0; i < pre[v].size(); i++) {
		dfs(pre[v][i]);
	}
	temppath.pop_back();
}
int main() {
	fill(dis, dis + 510, inf);
	fill(e, e + 510*510, inf);
	cin >> cmax >> n >> sp >> m;
	for (int i = 1; i <= n; i++) {
		cin >> weight[i];
		weight[i] =weight[i]-cmax / 2;
	}
	for (int i = 0; i < m; i++) {
		int a,b,temp;
		cin >> a >> b >> temp;
		e[a][b] = e[b][a] = temp;
	}
	dis[0] = 0;
	for (int i = 0; i <= n; i++) {
		int u = -1, min = inf;
		for (int j = 0; j <= n; j++) {
			if (visit[j] == false && dis[j] < min) {
				min = dis[j];
				u = j;
			}
		}
		visit[u] = true;
		for (int v = 0; v <= n; v++) {
			if (visit[v] == false) {
				if (dis[v] > dis[u] + e[u][v]) {
					dis[v] = dis[u] + e[u][v];
					pre[v].clear();
					pre[v].push_back(u);
				}
				else if (dis[v] == dis[u] + e[u][v]) {
					pre[v].push_back(u);
				}
			}
		}
	}
	dfs(sp);
	return 0;
}

  

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄