07-图6 旅游规划

来源:互联网 发布:明治天皇 知乎 编辑:程序博客网 时间:2024/04/28 18:00
#include <stdio.h>#define Max 505int 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];}}}}

0 0