#include <iostream>
using namespace std;
#define INFINITY 100000000
struct gnode
{
int weight;
int expenses;
}G[500][500];
int nv, ne;
int sta, enk;
int visit[500] = { 0 };
int dist[500], cost[500];
void build()
{//建立一个表
int v1, v2, w, ex;
for (int i = 0; i < nv; i++)
{
for (int j = 0; j < nv; j++)
{
G[i][j].expenses = INFINITY;
G[i][j].weight = INFINITY;
}
}
fill(dist, dist + nv, INFINITY);
fill(cost, cost + nv, 0);
for (int i = 0; i < ne; i++)
{
cin >> v1 >> v2 >> w >> ex;
G[v1][v2].weight = w;
G[v2][v1].weight = w;
G[v1][v2].expenses = ex;
G[v2][v1].expenses = ex;
}
}
void Dij()
{
dist[sta] = 0;
while (1)
{
int v = -1;
for (int u = 0; u < nv; u++)
{
if (!visit[u] && (v ==-1 || visit[u] < visit[v]))
v = u;
}
if (v == -1)
break;
visit[v] = 1;
for (int w = 0; w < nv; w++)
{
if (dist[v] + G[v][w].weight < dist[w])
{
dist[w] = dist[v] + G[v][w].weight;
cost[w] = cost[v] + G[v][w].expenses;
}
else if((dist[v] + G[v][w].weight == dist[w]) && (cost[v] + G[v][w].expenses < cost[w]))
{
cost[w] = cost[v] + G[v][w].expenses;
}
}
}
}
int main()
{
cin >> nv >> ne >> sta >> enk;
build();
Dij();
cout << dist[enk] << " " << cost[enk];
}
旅游规划之Dijkstra
最新推荐文章于 2022-03-20 10:23:55 发布