#include<iostream>
#include<string>
const int INF = 1e6;
using namespace std;
const int maxn = 5e2 + 10;
int md[maxn][maxn], mc[maxn][maxn];
int vis[maxn], dis[maxn], path[maxn], c[maxn];
int n, m, s, d, c1, c2, dist, cost;
void putout(int s, int d)
{
if (path[d]==-1)cout << s;
else
{
putout(s, path[d]);
cout << " " << d;
}
}
int main()
{
for (int i = 0; i < maxn; i++)
{
for (int j = 0; j < maxn; j++)
{
md[i][j] = INF;
mc[i][j] = INF;
}
path[i] = -1;
dis[i] = INF;
c[i] = INF;
}
cin >> n >> m >> s >> d;
for (int i = 0; i < m; i++)
{
cin >> c1 >> c2 >> dist >> cost;
md[c1][c2] = md[c2][c1] = dist;
mc[c1][c2] = mc[c2][c1] = cost;
}
for (int i = 0; i < n; i++)
{
dis[i] = md[s][i];
c[i] = mc[s][i];
if (dis[i] != INF)path[i] = s;
}
dis[s] = 0;
c[s] = 0;
vis[s] = 1;
while (1)
{
int min = INF, minv;
for (int j = 0; j < n; j++)
{
if (!vis[j] && dis[j] < min)min = dis[j], minv = j;
}
if (min == INF)break;
vis[minv] = 1;
for (int i = 0; i < n; i++)
{
if (md[minv][i] != INF && !vis[i])
{
if (dis[i] > dis[minv] + md[minv][i])
{
path[i] = minv;
dis[i] = dis[minv] + md[minv][i];
c[i] = c[minv] + mc[minv][i];
}
else
{
if (c[i] > c[minv] + mc[minv][i])
{
c[i] = c[minv] + mc[minv][i];
path[i] = minv;
}
}
}
}
}
putout(s, d);
cout <<" " << dis[d] << " " << c[d];
return 0;
}
1030. Travel Plan (30)
最新推荐文章于 2023-11-07 17:09:10 发布