dijkstra基本背过了,错误出在下标写错上。。
#include<bits/stdc++.h>
#define MAXN 510
using namespace std;
const int INF=1000000000;
int n;
int g[MAXN][MAXN];
int cost[MAXN][MAXN];
int d[MAXN];
int cc[MAXN];
bool vis[MAXN];
int pre[MAXN];
void dijkstra(int s){
fill(d,d+MAXN,INF);
fill(cc,cc+MAXN,INF);
d[s]=0;
cc[s]=0;
for(int i=0;i<n;i++){
int minn=INF,u=-1;
for(int j=0;j<n;j++){
if(vis[j]==false&&d[j]<minn){
minn=d[j];
u=j;
}
}
if(u==-1)return;
vis[u]=true;
for(int v=0;v<n;v++){
if(g[u][v]!=INF&&vis[v]==false){
if(d[v]>d[u]+g[u][v]){
d[v]=d[u]+g[u][v];
cc[v]=cc[u]+cost[u][v];
pre[v]=u;
}
else if(d[v]==d[u]+g[u][v]&&cc[v]>cc[u]+cost[u][v]){
d[v]=d[u]+g[u][v];
cc[v]=cc[u]+cost[u][v];
pre[v]=u;
}
}
}
}
}
int main(){
int m,ss,dd;
cin>>n>>m>>ss>>dd;
int a,b,l,c;
fill(g[0],g[0]+MAXN*MAXN,INF);
fill(cost[0],cost[0]+MAXN*MAXN,INF);
for(int i=0;i<m;i++){
cin>>a>>b>>l>>c;
g[a][b]=l;
g[b][a]=l;
cost[a][b]=c;
cost[b][a]=c;
}
dijkstra(ss);
vector<int>ans;
int tag=dd;
while(tag!=ss){
ans.push_back(tag);
tag=pre[tag];
}
ans.push_back(ss);
reverse(ans.begin(),ans.end());
ans.push_back(d[dd]);
ans.push_back(cc[dd]);
for(int i=0;i<ans.size();i++){
printf("%d",ans[i]);
if(i!=ans.size()-1)printf(" ");
}
return 0;
}