#include <ios>
#include <iostream>
#include <queue>
#include <vector>
#include <fstream>
#include <climits>
#include <cstring>
using namespace std;
const int size_z = 1 << 10;
// 别用INT_MAX,会溢出
const int inf = 0x3f3f3f3f;
// 记录输入的路径距离和花费
int dis[size_z][size_z];
int cos[size_z][size_z];
vector<int> dj_algorithm(int vertex, int start, int dest) {
// 找出最短路径,如果最短路径一样,则选择花费少的
// distance:目前从start点到第i个点的最短距离是多少
// cost:目前从start到第i个点的最低花费是多少
// 注意:由于cost状态发生改变的同时distance一定会发生改变
vector<int> distance(vertex, inf);
vector<int> cost(vertex, inf);
vector<bool> visited(vertex, false);
visited[start] = true;
for (int i = 0; i < vertex; ++i) {
distance[i] = dis[start][i];
cost[i] = cos[start][i];
}
for (int i = 0; i < vertex; ++i) {
// 选择一条最短边,并把他设置为true
int pos = 0, min_value = inf;
for (int j = 0; j < vertex; ++j) {
if (!visited[j] && distance[j] < min_value) {
pos = j;
min_value = distance[j];
}
}
visited[pos] = true;
for (int j = 0; j < vertex; ++j) {
if (!visited[j] && distance[j] > distance[pos] + dis[pos][j]) {
distance[j] = distance[pos] + dis[pos][j];
cost[j] = cost[pos] + cos[pos][j];
} else if (!visited[j] &&
distance[j] == distance[pos] + dis[pos][j] &&
cost[pos] + cos[pos][j] < cost[j]) {
cost[j] = cost[pos] + cos[pos][j];
}
}
}
return {distance[dest], cost[dest]};
}
int main() {
ios::sync_with_stdio(false);
int n, m, s, d, from, to, distance, cost;
cin >> n >> m >> s >> d;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
dis[i][j] = i != j ? inf : 0;
}
}
while (m--) {
cin >> from >> to >> distance >> cost;
dis[from][to] = dis[to][from] = distance;
cos[from][to] = cos[to][from] = cost;
}
auto res = dj_algorithm(n, s, d);
cout << res[0] << " " << res[1] << endl;
return 0;
}
7-9 旅游规划
最新推荐文章于 2024-06-13 10:13:20 发布