#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int N=500;
const int INF = 500;
int map[N+1][N+1][2];
int cost[N+1],dist[N];
int visited[N+1];
void dijkstra();
int main(){
int n,m,s,d;
cin>>n>>m>>s>>d;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
map[i][j][0] = INF;
map[i][j][1] = INF;
map[j][i][0] = INF;
map[j][i][1] = INF;
}
} //初始化所有的路线和油费为INF
for(int i=0;i<m;i++){
int x,y,g,h;
cin>>x>>y>>g>>h;
map[x][y][0] = g;
map[y][x][0] = g;
map[x][y][1] = h;
map[y][x][1] = h;
} //写入两点之间的路线和油费,如果没有的话就还是INF。
for(int i=0;i<n;i++){
visited[i] = 0; //标记是否访问过
dist[i] = map[s][i][0];
cost[i] = map[s][i][1];
} //因为题目要求是从s到d的结点,所以可以求出s到每个结点的最短距离,然后用dist[d],cost[d] 就可以输出答案。
//因为求s---d 所以初始化s为访问过,且到s--s的距离为0
visited[s] = 1;
dist[s] = 0;
dist[n] = INF;
cost[s] = 0;
while(1){
int v = n;
//从未访问的且与s有边的结点中寻找最小值。
for(int i=0;i<n;i++){
if(dist[i]<dist[v]&&visited[i]==0){
v = i;
}
}
if(v==n) break; // 如果v==n表示没有找到最小的距离,就退出
visited[v] = 1;
for(int w=0;w<n;w++){
if(visited[w]==0&&map[v][w][0]<INF){
//如果s--v+v--w的距离<s--w的距离,则就更新s---w的值,取小的
if(map[v][w][0]+dist[v]<dist[w]){
dist[w] = map[v][w][0] + dist[v];
cost[w] = map[v][w][1] + cost[v];
}
//如果路径相等,就比较钱数
else if(map[v][w][0]+dist[v]==dist[w]&&cost[w]>=map[v][w][1]+cost[v]){
cost[w] = cost[v] + map[v][w][1];
}
}
}
}
if(dist[d]<INF)
cout<<dist[d]<<" "<<cost[d]<<endl;
return 0;
}
《旅游规划》之dijkstra算法
最新推荐文章于 2023-04-15 18:32:32 发布