在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); } }