解题代码
#include<stdio.h>
#define MAXN 500
#define ERROR -1
#define Infinite 65534
int N, M, S, D;
int Dist[MAXN][MAXN], Cost[MAXN][MAXN];
int dist[MAXN], cost[MAXN], visit[MAXN];
void Inicialization(void);
void FindTheWay(void);
int FindMinWay(void);
int main()
{
scanf("%d %d %d %d", &N, &M, &S, &D);
Inicialization();
FindTheWay();
printf("%d %d", dist[D], cost[D]);
return 0;
}
void Inicialization(void) {
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
Dist[i][j] = Cost[i][j] = Infinite;
int v1, v2, d, c;
for (int i = 0; i < M; i++) {
scanf("%d %d %d %d", &v1, &v2, &d, &c);
Dist[v1][v2] = Dist[v2][v1] = d;
Cost[v1][v2] = Cost[v2][v1] = c;
}
for (int i = 0; i < N; i++)
dist[i] = cost[i] = Infinite;
}
void FindTheWay(void) {
dist[S] = cost[S] = 0;
visit[S] = 1;
int v;
for (int i = 0; i < N; i++)
if (!visit[i] && Dist[S][i] < Infinite) {
dist[i] = Dist[S][i];
cost[i] = Cost[S][i];
}
while (1) {
v = FindMinWay();
if (v == ERROR) break;
visit[v] = 1;
for(int i=0;i<N;i++)
if(!visit[i] && Dist[v][i]<Infinite)
if ((dist[v] + Dist[v][i] < dist[i]) || (dist[v] + Dist[v][i] == dist[i] && cost[v] + Cost[v][i] < cost[i])) {
dist[i] = dist[v] + Dist[v][i];
cost[i] = cost[v] + Cost[v][i];
}
}
}
int FindMinWay(void) {
int min = Infinite, index;
for(int i=0;i<N;i++)
if (!visit[i] && dist[i] < min) {
min = dist[i];
index = i;
}
if (min == Infinite) return ERROR;
return index;
}
测试结果
问题整理
1.基础Dijkstra题型。