#include <stdio.h>
#define Max 505
int Graph[Max][Max], Cost[Max][Max];
void Dijkstra(int S, int N, int *dist, int *cost);
int main(int argc, char const *argv[])
{
// freopen("test.txt", "r", stdin);
int N, M, S, D;
scanf("%d %d %d %d", &N, &M, &S, &D);
int dist[N], cost[N];
for (int i = 0; i < N; i++){
for (int j = 0; j < N; j++){
Graph[i][j] = Max;
Cost[i][j] = Max;
}
dist[i] = Max, cost[i] = Max;
}
for (int i = 0; i < M; i++){
int c1, c2, len, charge;
scanf("%d %d %d %d", &c1, &c2, &len, &charge);
Graph[c1][c2] = Graph[c2][c1] = len;
Cost[c1][c2] = Cost[c2][c1] = charge;
}
Dijkstra(S, N, dist, cost);
printf("%d %d", dist[D], cost[D]);
return 0;
}
void Dijkstra(int S, int N, int *dist, int *cost)
{
int collected[N];
for (int i = 0; i < N; i++)
collected[i] = 0;
dist[S] = 0, cost[S] = 0;
while(1){
int mindist = Max+1, v = -1;
for (int i = 0; i < N; i++){
if (collected[i] == 0 && dist[i] < mindist){
v = i;
mindist = dist[i];
}
}
if (v == -1)
break;
collected[v] = 1;
for (int i = 0; i < N; i++){
if (collected[i] == 0 && Graph[v][i] != Max){
if (dist[v] + Graph[v][i] < dist[i]){
dist[i] = dist[v] + Graph[v][i];
cost[i] = cost[v] + Cost[v][i];
}
else if (dist[v] + Graph[v][i] == dist[i] && cost[v] + Cost[v][i] < cost[i])
cost[i] = cost[v] + Cost[v][i];
}
}
}
}
07-图6 旅游规划
最新推荐文章于 2024-05-17 10:52:02 发布