#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef struct City
{
int is_true;//是否加入序列
int len;//初点到每个城市的长度
int pay;//初点到每个城市的费用;
};
typedef struct Data // 用矩阵表示每个城市之间的距离和费用
{
int len;
int pay;
};
City *citys;
Data **data;
void Init_data_citys(int N)
{
citys = new City[N + 2];
data = new Data*[N + 2];
for(int i = 0; i < N; i++)
{
data[i] = new Data[N + 2];
for(int j = 0; j < N + 2; j++)
{
data[i][j].len = INF;
data[i][j].pay = INF;
}
}
for(int i = 0; i < N + 2; i++)
{
citys[i].is_true = 1;
citys[i].len = INF;
citys[i].pay = INF;
}
}
int Djstl(int N)
{
for(int k = 0; k < N; k++)
{
int min_pos = N;
for(int j = 0; j < N; j++)
{
if(citys[j].is_true == 1 && citys[j].len < citys[min_pos].len)
min_pos = j;
if(citys[j].is_true == 1 && citys[j].len == citys[min_pos].len)
if(citys[j].pay < citys[min_pos].pay)
min_pos = j;
}
if(min_pos == N)
return 0;
citys[min_pos].is_true = 0;
for(int i = 0; i < N; i++)
{
if(citys[i].is_true == 0)
continue;
if(citys[i].len > citys[min_pos].len + data[min_pos][i].len)
{
citys[i].len = citys[min_pos].len + data[min_pos][i].len;
citys[i].pay = citys[min_pos].pay + data[min_pos][i].pay;
}
if(citys[i].len == citys[min_pos].len + data[min_pos][i].len)
if(citys[i].pay > citys[min_pos].pay + data[min_pos][i].pay)
citys[i].pay = citys[min_pos].pay + data[min_pos][i].pay;
}
}
}
int main()
{
int N, M, st, en;
scanf("%d %d %d %d", &N, &M, &st, &en);
Init_data_citys(N);
int s, e, len, pay;
for(int i = 0; i < M; i++)
{
scanf("%d %d %d %d", &s, &e, &len, &pay);
data[s][e].len = len;
data[s][e].pay = pay;
data[e][s].pay = pay;
data[e][s].len = len;
}
data[st][st].len = 0;
data[st][st].pay = 0;
for(int i = 0; i < N; i++)
{
citys[i].len = data[st][i].len;
citys[i].pay = data[st][i].pay;
}
citys[st].is_true = 0;
citys[st].len = 0;
citys[st].pay = 0;
Djstl(N);
printf("%d %d", citys[en].len, citys[en].pay);
}
7-10 旅游规划 (25分)
最新推荐文章于 2023-06-08 14:25:06 发布