temporary
#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实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
更多精彩

