Dijkstra邻接表
# include <iostream>
# include <vector>
# include <algorithm>
using namespace std;
const int INF = 0xffffff;
struct ArcNode{
int v;
int distance, cost;
};
int N, M;
int S, D;
vector<ArcNode> G[510];
int dist[510];
int cost[510];
bool vis[510];
vector<int> pre(510);
void Dijkstra(int s){
fill(dist, end(dist), INF);
fill(cost, end(cost), INF);
fill(vis, end(vis), false);
for(int i = 0;i < N;++i) pre[i] = i;
dist[s] = 0;
cost[s] = 0;
for(int i = 0; i < N ;++i){
int u = -1;
int MIN = INF;
for(int j = 0; j < N ;++j){
if(vis[j] == false && dist[j] < MIN){
u = j;
MIN = dist[j];
}
}
if(u == -1) return;
vis[u] = true;
for(ArcNode next: G[u]){
if(vis[next.v] == false){
if(dist[u] + next.distance < dist[next.v]){
dist[next.v] = dist[u] + next.distance;
cost[next.v] = cost[u] + next.cost;
pre [next.v] = u;
}
else
if(dist[u] + next.distance == dist[next.v]){
if(cost[u] + next.cost < cost[next.v]){
cost[next.v] = cost[u] + next.cost;
pre [next.v] = u;
}
}
}
}
}
}
void printPATH(int v){
if(v == S){
cout << S << " ";
return;
}
printPATH(pre[v]);
cout << v << " ";
}
int main(){
cin >> N >> M >> S >> D;
for(int i = 0;i < M;++i){
int C1, C2, d, c;
cin >> C1 >> C2 >> d >> c;
G[C1].push_back({
C2, d, c});
G[C2].push_back({
C1, d, c});
}
Dijkstra(S);
printPATH(D);
cout << dist[D] << " " << cost[D] << endl;
return 0;
}
Dijkstra + DFS邻接表
# include <iostream>
# include <vector>
# include <algorithm>
using namespace std;
const int INF = 0xffffff;
struct ArcNode{
int v;
int distance, cost;
};
int N, M;
int S, D;
vector<ArcNode> G[510];
int dist[510];
bool vis[510];
vector<int> pre[510];
void Dijkstra(int s){
fill(dist, end(dist), INF);
fill(vis, end(vis), false);
dist[s] = 0;
for(int i = 0; i < N ;++i){
int u = -1;
int MIN = INF;
for(int j = 0; j < N ;++j){
if(vis[j] == false && dist[j] < MIN){
u = j;
MIN = dist[j];
}
}
if(u == -1) return;
vis[u] = true;
for(ArcNode next: G[u]){
if(vis[next.v] == false){
if(dist[u] + next.distance < dist[next.v]){
dist[next.v] = dist[u] + next.distance;
pre [next.v].clear();
pre [next.v].push_back(u);
}
else
if(dist[u] + next.distance == dist[next.v]){
pre [next.v].push_back(u);
}
}
}
}
}
vector<int> path, tempPath;
int minSumCost = INF;
void DFS(int v){
if(v == S){
tempPath.push_back(S);
int sumcost = 0;
for(int i = tempPath.size() - 1; i > 0 ;--i){
int id = tempPath[i], idnext = tempPath[i-1];
for(int REALidnext = 0;REALidnext < G[id].size();++REALidnext)
if(G[id][REALidnext].v == idnext)
sumcost += G[id][REALidnext].cost;
}
if(sumcost < minSumCost){
minSumCost = sumcost;
path = tempPath;
}
tempPath.pop_back();
return;
}
tempPath.push_back(v);
for(int u: pre[v])
DFS(u);
tempPath.pop_back();
}
int main(){
cin >> N >> M >> S >> D;
for(int i = 0;i < M;++i){
int C1, C2, d, c;
cin >> C1 >> C2 >> d >> c;
G[C1].push_back({
C2, d, c});
G[C2].push_back({
C1, d, c});
}
Dijkstra(S);
DFS(D);
for(int i = path.size()-1;i>=0;i--)
cout << path[i] << " ";
cout << dist[D] << " " << minSumCost << endl;
return 0;
}