在Dijstra的基础上加上一个cost即可
#include<iostream>
#include<algorithm>
#include<climits>
#include<queue>
using namespace std;
#define N 300
struct Edge { //记录点关联边
int to;
int length;
int cost;
};
struct Node {
int to;
int dist;
int cost;
};
vector<Edge> graph[N]; //记录每个顶点的边
bool operator < (Node lhs, Node rhs)
{
return lhs.dist > rhs.dist;
}
void dijkstra(int s, int t, int n) {
int dist[N];
int cost[N];
bool visit[N];
for (int i = 1; i <=n; i++) {
dist[i] = INT_MAX;
cost[i] = INT_MAX;
visit[i] = false;
}
priority_queue<Node> pqueue; //建立小根堆
dist[s] = 0;
cost[s] = 0;
Node node;
node.dist = dist[s];
node.cost = cost[s];
node.to = s;
pqueue.push(node);
while (!pqueue.empty())
{
int x = pqueue.top().to;
pqueue.pop();
if (visit[x] == true)
continue;
visit[x] = false;
for (int i = 0; i < graph[x].size(); i++) {
int y = graph[x][i].to;
int length = graph[x][i].length;
int c = graph[x][i].cost;
if (dist[y] > dist[x] + length) {
dist[y] = dist[x] + length;
cost[y] = cost[x] + c;
node.dist = dist[y];
node.cost = cost[y];
node.to = y;
pqueue.push(node);
}
else if (dist[y] == dist[x] + length) {
if (cost[y] > cost[x] + c) {
dist[y] = dist[x] + length;
cost[y] = cost[x] + c;
node.dist = dist[y];
node.cost = cost[y];
node.to = y;
pqueue.push(node);
}
}
}
}
cout << dist[t] << ' ' << cost[t] << endl; //输出结果
}
int main() {
int n, m;
while (cin >> n >> m) {
if(n==0&&m==0) break;
for (int i = 1; i <= n; i++) {
graph[i].clear(); //清理残余变量
}
for (int i = 0; i < m; i++) {
int x, y, length, cost;
cin >> x >> y >> length >> cost;
Edge edge;
edge.to = y;
edge.length = length;
edge.cost = cost;
graph[x].push_back(edge);
edge.to = x;
edge.length = length;
edge.cost = cost;
graph[y].push_back(edge);
}
int s, t;
cin >> s >> t;
dijkstra(s, t, n);
}
}