方法:dijkstra寻找路径,同时边权之和最小
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn=520;
const int INF=10000000;
struct arc{
int distance,cost,next;
};
vector<arc> ar[maxn];
vector<int> path;
int numc,numh,start,des;
int dis[maxn],pre[maxn],co[maxn]={0};
bool vis[maxn]={0};
void dijkstra(){
fill(dis,dis+maxn,INF);
fill(pre,pre+maxn,-1);
dis[start]=0;
for(int i=0;i<numc;i++){
int min=INF,minv=-1;
for(int j=0;j<numc;j++){
if(vis[j]==false&&dis[j]<min){
min=dis[j];
minv=j;
}
}
if(minv==-1||minv==des) break;
vis[minv]=true;
for(int j=0;j<ar[minv].size();j++){
int tc=ar[minv][j].next;
if(vis[tc]==false){
if(dis[tc]>dis[minv]+ar[minv][j].distance){
dis[tc]=dis[minv]+ar[minv][j].distance;
co[tc]=ar[minv][j].cost+co[minv];
pre[tc]=minv;
}else if(dis[tc]==dis[minv]+ar[minv][j].distance&&ar[minv][j].cost+co[minv]<co[tc]){
co[tc]=ar[minv][j].cost+co[minv];
pre[tc]=minv;
}
}
}
}
for(int i=des;i!=start&&i!=-1;i=pre[i])
path.push_back(i);
printf("%d ",start);
for(int i=path.size()-1;i>=0;i--)
printf("%d ",path[i]);
printf("%d %d",dis[des],co[des]);
}
int main(){
scanf("%d%d%d%d",&numc,&numh,&start,&des);
for(int i=0;i<numh;i++){
int c1,c2;
arc temp;
scanf("%d%d%d%d",&c1,&c2,&temp.distance,&temp.cost);
temp.next=c2;
ar[c1].push_back(temp);
temp.next=c1;
ar[c2].push_back(temp);
}
dijkstra();
return 0;
}