#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>
using namespace std;
const int maxv = INT_MAX;
struct Highway{
int dis;
int cost;
};
Highway highways[510][510];
int dist[510];
int c[510];
int pre[510];
bool vis[510] = {false};
int n,m,s,d;
void Dijkstra(int s){
dist[s] = 0;
c[s] = 0;
for(int i = 0;i < n;i++){//循环n次
int u = -1,min = maxv,minc = maxv;//u使dist[u]最小,min存放该最小的dist[u]
for(int j = 0;j < n;j++){
if(vis[j] == false && (dist[j] < min || (dist[j] == min && c[j] < minc))){
u = j;
min = dist[j];
minc = c[j];
}
}
//找到不小于maxv的dist[u],说明剩下的顶点和起点s不连通
if(u == -1) return;
vis[u] = true;//标记u为已访问
for(int v = 0;v < n;v++){
//如果v未访问 && u能到达v && 以u为中介点可使dist[v]更优
if(vis[v] == false && highways[u][v].dis != maxv &&
(dist[u] + highways[u][v].dis < dist[v] || (dist[u] + highways[u][v].dis == dist[v] && c[u] + highways[u][v].cost < c[v]))){
dist[v] = dist[u] + highways[u][v].dis;//优化dist[v]
c[v] = c[u] + highways[u][v].cost;
pre[v] = u;
}
}
}
}
int main(){
scanf("%d %d %d %d",&n,&m,&s,&d);
for(int i = 0;i < n;i++){
for(int j = 0;j < n;j++){
highways[i][j].cost = maxv;
highways[i][j].dis = maxv;
}
}
fill(dist,dist + 510,maxv);
fill(c,c + 510,maxv);
fill(pre,pre + 510,-1);
for(int i = 0;i < m;i++){
int city1,city2;
scanf("%d %d",&city1,&city2);
scanf("%d %d",&highways[city1][city2].dis,&highways[city1][city2].cost);
highways[city2][city1].dis = highways[city1][city2].dis;
highways[city2][city1].cost = highways[city1][city2].cost;
}
Dijkstra(s);
vector<int> path;
int i = d;
while(pre[i] != -1){
path.insert(path.begin(),i);
i = pre[i];
}
path.insert(path.begin(),s);
for(unsigned int j = 0;j < path.size();j++){
printf("%d ",path[j]);
}
printf("%d %d",dist[d],c[d]);
system("pause");
return 0;
}
highways[city2][city1].cost = highways[city1][city2].cost;
被我写成了
highways[city2][city2].cost = highways[city1][city2].cost;
找了一个小时
气死我辣!