//
// main.cpp
// PATA1003
//
// Created by Phoenix on 2018/1/30.
// Copyright © 2018年 Phoenix. All rights reserved.
//
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
const int maxn = 510;
const int inf = 1000000000;
int n, m, st, ed;
int G[maxn][maxn];
bool vis[maxn] = {false};
int d[maxn];
int team[maxn];
vector<int> pre[maxn];
void dijkstra(int s){
fill(d, d + maxn, inf);
d[s] = 0;
for(int i = 0; i < n; i++) {
int u = -1, MIN = inf;
for(int j = 0; j < n; j++) {
if(vis[j] == false && d[j] < MIN) {
u = j;
MIN = d[j];
}
}
if(u == -1) return;
vis[u] = true;
for(int v = 0; v < n; v++) {
if(vis[v] == false && G[u][v] != inf) {
if(d[u] + G[u][v] < d[v]) {
d[v] = d[u] + G[u][v];
pre[v].clear();
pre[v].push_back(u);
} else if(d[u] + G[u][v] == d[v]) {
pre[v].push_back(u);
}
}
}
}
}
vector<int> path, tempPath;
int optvalue = 0,k = 0;
void DFS(int v){
if(v == st){
tempPath.push_back(v);
k++;
int value = 0;
for (int i = 0; i < tempPath.size(); i++) {
value += team[tempPath[i]];
}
if(value > optvalue) {
path = tempPath;
optvalue = value;
}
tempPath.pop_back();
return;
}
tempPath.push_back(v);
for(int i = 0; i < pre[v].size(); i++) {
DFS(pre[v][i]);
}
tempPath.pop_back();
}
int main(int argc, const char * argv[]) {
scanf("%d %d %d %d", &n, &m, &st, &ed);
for(int i = 0; i < n; i++) {
scanf("%d", &team[i]);
}
fill(G[0], G[0] + maxn * maxn, inf);
for(int i = 0; i < m; i++) {
int a, b, l;
scanf("%d %d %d", &a, &b, &l);
G[a][b] = G[b][a] = l;
}
dijkstra(st);
DFS(ed);
printf("%d %d", k, optvalue);
return 0;
}
最短路径模版题
PATA1003题解
最新推荐文章于 2021-02-02 13:06:00 发布