题目描述

最短路径问题,并且输出最短路径,经典例题,多多品味,对于这种题应该可以很快敲出
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
struct Node{
int v,dis,cost;
Node(int a,int b,int c){
v=a;
dis=b;
cost=c;
}
};
const int MAXV=505;
const int INF=0x3fffffff;
vector<Node> Adj[MAXV];
int n;
int d[MAXV];
bool vis[MAXV]={false};
int pre[MAXV];
int c[MAXV];
void Dijkstra(int s){
fill(d,d+MAXV,INF);
fill(c,c+MAXV,INF);
d[s]=c[s]=0;
for(int i=0;i<n;i++){
int u=-1,MIN=INF;
for(int j=0;j<n;j++){
if(vis[j]==false&&d[j]<MIN){
u=j;
MIN=d[j];
}
}
if(u==-1){
return;
}
vis[u]=true;
for(int j=0;j<Adj[u].size();j++){
int v=Adj[u][j].v;
if(vis[v]==false)
if(d[u]+Adj[u][j].dis<d[v]){
d[v]=d[u]+Adj[u][j].dis;
c[v]=c[u]+Adj[u][j].cost;
pre[v]=u;
}else if(d[u]+Adj[u][j].dis==d[v]&&c[u]+Adj[u][j].cost<c[v]){
c[v]=c[u]+Adj[u][j].cost;
pre[v]=u;
}
}
}
}
void DFS(int s,int v){
if(v==s){
printf("%d",s);
return;
}
DFS(s,pre[v]);
printf(" %d",v);
}
int main(){
int m,s,k;
scanf("%d%d%d%d",&n,&m,&s,&k);
for(int i=0;i<m;i++){
int a,b,c,e;
scanf("%d%d%d%d",&a,&b,&c,&e);
Adj[a].push_back(Node(b,c,e));
Adj[b].push_back(Node(a,c,e));
}
Dijkstra(s);
DFS(s,k);
printf(" %d %d",d[k],c[k]);
return 0;
}