本题为单源最短路径问题,故可以考虑使用迪杰斯特拉算法,传入一个整型变量作为起点,同时维护两个全局记录最短距离和最小花费的数组。在迪杰斯特拉算法的内部,通过对邻接表的遍历更新这两个数组,遍历完成后数组下标对应的元素即为所得,打印即可。详细算法步骤见注释
#include <bits/stdc++.h>
using namespace std;
int MAXNUM = 1010;
int INF=INT_MAX;
struct Edge {//边表,记录目标节点,路径长度,花费
int to;
int length;
int price;
Edge(int _t, int _l, int _p) {//构造函数,简化后续
to = _t;
length = _l;
price = _p;
}
};
struct QueueNode{//在优先队列中的节点,记录当前节点出发到各个节点的距离
int number;
int distance;
QueueNode(int _n,int _d){
number = _n;
distance = _d;
}
bool operator<(const QueueNode& p)const{//重载运算符。将小于号重载为大于号
return distance>p.distance;
}
};
vector<Edge> graph[1010];//邻接表,graph[i][]表示从i节点开始的边数
int minDistance[1010];//最小距离数组
int cost[1010];//最小花费数组
void Dijkstra(int start){
minDistance[start]=0;//初始化,将起始点到自己的距离和花费都变成0
cost[start]=0;
priority_queue<QueueNode> MyPriQue;//新建优先队列,运算符已经重载了,变成升序序列
MyPriQue.push(QueueNode(start,minDistance[start]));//起始节点入队
while(!MyPriQue.empty()) {//优先队列为空时停止循环
int u = MyPriQue.top().number;//记录离原点最近的点
MyPriQue.pop();//弹出队首元素
for(int i=0;i<graph[u].size();i++){ //遍历当前节点u的邻接边表
int v = graph[u][i].to;//to代表目标的节点
int l = graph[u][i].length;
int p = graph[u][i].price;
if((minDistance[v]==minDistance[u]+l&&cost[v]>cost[u]+p)||minDistance[v]>minDistance[u]+l){
minDistance[v]=minDistance[u]+l;//若出发点到v的距离大于途径u到v的距离,或者相等条件下小于途径u到v的花费,就将v对应的mindistance和cost进行修改,并把v重新压入优先队列中。
cost[v]=cost[u]+p;
MyPriQue.push(QueueNode(v,minDistance[v]));
}
}
}
return;
}
int main() {
int n,m;
while(scanf("%d%d",&n,&m)!=EOF){
if(n==0&&m==0){
break;
}
memset(graph,0,sizeof(graph));//初始化邻接表
fill(minDistance, minDistance+n+1,INF);//初始化两个数组,fill()函数是algorithm头文件定义的函数。fill(a.begin(),a.end(),INF)为用法,这里使用数组首地址和首地址+整形表示数组长度,参数一定要用地址!
fill(cost,cost+n+1,INF);
while(m--){
int to,from,distance,costt;
scanf("%d%d%d%d",&to,&from,&distance,&costt);
graph[to].push_back(Edge(from,distance,costt));//无向图,故每一条边需要对两个端点分别存一下邻接表。
graph[from].push_back((Edge(to,distance,costt)));
}
int start,end;//读取起始节点和终止节点
scanf("%d%d",&start,&end);
Dijkstra(start);//调用最短路径算法
printf("%d %d\n", minDistance[end], cost[end]);//直接打印终止节点对应的distanc和cost值即可
}
return 0;
}



京公网安备 11010502036488号