有了一张自驾旅游路线图,你会知道城市间的高速公路长度、以及该公路要收取的过路费。现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径。如果有若干条路径都是最短的,那么需要输出最便宜的一条路径。
输入格式:
输入说明:输入数据的第1行给出4个正整数N、M、S、D,其中N(2)是城市的个数,顺便假设城市的编号为0~(N−1);M是高速公路的条数;S是出发地的城市编号;D是目的地的城市编号。随后的M行中,每行给出一条高速公路的信息,分别是:城市1、城市2、高速公路长度、收费额,中间用空格分开,数字均为整数且不超过500。输入保证解的存在。
输出格式:
在一行里输出路径的长度和收费总额,数字间以空格分隔,输出结尾不能有多余空格。
输入样例:
4 5 0 3
0 1 1 20
1 3 2 30
0 3 4 10
0 2 2 20
2 3 1 20
输出样例:
3 40
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 1000000
typedef struct node {
int start;
int end;
int money;
int Long;
}Node;
typedef struct t {
int longs;
int states;
int Moneys;
}T;
int main()
{
int n, m, str, eng;
scanf("%d %d %d %d", &n, &m, &str, &eng);
Node *N = (Node *)malloc(sizeof(Node)*m);
//保存路线
for (int i = 0; i < m; i++) {
scanf("%d %d %d %d", &N[i].start, &N[i].end, &N[i].Long, &N[i].money);
}
if (n==2) {
printf("%d %d", N[0].Long, N[0].money);
}
else {
int *moneyss = (int *)malloc(sizeof(int)*n);
int *Longs = (int *)malloc(sizeof(int)*n);
int *states = (int *)malloc(sizeof(int)*n);
//初始化数据
for (int i = 0; i < n; i++)
{
moneyss[i] = MAXSIZE;
Longs[i] = MAXSIZE;
states[i] = 0;
}
moneyss[str] = 0;
Longs[str] = 0;
states[str] = 1;
for (int i = 0; i < m; i++)
{
if (N[i].start == str) {
moneyss[N[i].end] = N[i].money;
Longs[N[i].end] = N[i].Long;
}
if (N[i].end == str) {
moneyss[N[i].start] = N[i].money;
Longs[N[i].start] = N[i].Long;
}
}
while (1)
{
int starts = -1, min = MAXSIZE;
for (int i = 0; i < n; i++)
{ //找到目前最短路径
if (states[i] != 1 && Longs[i] < min) {
min = Longs[i];
starts = i;
}
}
if (starts == -1 || starts == eng) {
break;
}
else
{
states[starts] = 1;
for (int i = 0; i < m; i++)
{
if (N[i].start == starts && states[N[i].end] != 1) { //从该点扫描位走过的点
if (N[i].Long + Longs[N[i].start] < Longs[N[i].end]) {
Longs[N[i].end] = N[i].Long + Longs[N[i].start];
moneyss[N[i].end] = N[i].money + moneyss[N[i].start];
}
else if (N[i].Long + Longs[N[i].start] == Longs[N[i].end] && moneyss[N[i].end] > N[i].money + moneyss[N[i].start]) {
moneyss[N[i].end] = N[i].money + moneyss[N[i].start];
}
}
if (N[i].end == starts && states[N[i].start] != 1) { //从该点扫描位走过的点
if (N[i].Long + Longs[N[i].end] < Longs[N[i].start]) {
Longs[N[i].start] = N[i].Long + Longs[N[i].end];
moneyss[N[i].start] = N[i].money + moneyss[N[i].end];
}
else if (N[i].Long + Longs[N[i].end] == Longs[N[i].start] && moneyss[N[i].start] > N[i].money + moneyss[N[i].end]) {
moneyss[N[i].start] = N[i].money + moneyss[N[i].end];
}
}
}
}
}
printf("%d %d", Longs[eng], moneyss[eng]);
}
return 0;
}