PTA甲级1030,带路径打印和费用最优的dijkstra题目,代码有所参考
#include <iostream>
#include <cstring>
#include <stack>
#define INF 0x3f3f
using namespace std;
int themap[501][501],thecost[501][501];
bool visit[501];
int thedistance[501],precity[501],allcost[501];
int n,m;
stack<int> sta;
void dijkstra(int start,int end){
for(int i=0;i<n;i++){
thedistance[i]=themap[start][i];
allcost[i]=thecost[start][i];
}
thedistance[start]=0;
visit[start]=1;
precity[start]=-1;
allcost[start]=0;
for(int i=1;i<n;i++){
//寻找最近点
int mindis=INF,minid=-1,mincost=INF;
for(int j=0;j<n;j++){
if(mindis>thedistance[j] && visit[j]==0){
mindis=thedistance[j];
minid=j;
}
}
//攻占最近点
visit[minid]=1;
for(int j=0;j<n;j++){
if(visit[j]==0){
if(thedistance[j]>mindis+themap[minid][j]){
thedistance[j]=mindis+themap[minid][j];
allcost[j]=allcost[minid]+thecost[minid][j];
precity[j]=minid;
}
if(thedistance[j]==mindis+themap[minid][j] && allcost[j]>allcost[minid]+thecost[minid][j]){
allcost[j]=allcost[minid]+thecost[minid][j];
precity[j]=minid;
}
}
}
if(minid==end) return ;
}
}
int main(){
int start,end; cin>>n>>m>>start>>end;
memset(themap,INF,sizeof(themap));
memset(thecost,INF,sizeof(thecost));
memset(visit,0,sizeof(visit));
for(int i=0;i<m;i++){
int scity,ecity,dis,cost;
cin>>scity>>ecity>>dis>>cost;
themap[scity][ecity]=dis;
themap[ecity][scity]=dis;
thecost[scity][ecity]=cost;
thecost[ecity][scity]=cost;
}
dijkstra(start,end);
int temp=end;
while(temp!=-1){
sta.push(temp);
temp=precity[temp];
}
while(!sta.empty()){
cout<<sta.top()<<" ";
sta.pop();
}
cout<<thedistance[end]<<" "<<allcost[end];
return 0;
}