#include <iostream>
using namespace std;
int g[1001][1001];
int cost[1001][1001];
int dist[1001];
int money[1001];
int f[1001];
// no prev
int main()
{
int n, m;
int i, j;
int a, b, c, d;
int src, dst;
while (1)
{
scanf("%d %d", &n, &m);
if (!n && !m) break;
// 初始化距离矩阵和花费矩阵
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{
g[i][j] = INT_MAX;
g[j][i] = INT_MAX;
cost[i][j] = INT_MAX;
cost[j][i] = INT_MAX;
}
g[i][i] = 0;
cost[i][i] = 0;
}
// 读入边
while (m--)
{
scanf("%d %d %d %d", &a, &b, &c, &d);
if (g[a][b] > c)
{
g[a][b] = c;
g[b][a] = c;
cost[a][b] = d;
cost[b][a] = d;
}
else if (g[a][b] == c&&cost[a][b] > d)
{
cost[a][b] = d;
cost[b][a] = d;
}
}
scanf("%d %d", &src, &dst);
// 初始化dist数组和money数组
for (i = 1; i <= n; i++)
{
dist[i] = g[src][i];
money[i] = cost[src][i];
f[i] = 0;
}
f[src] = 1;
for (i = 1; i < n; i++)
{
int temp = INT_MAX;
int u = src;
for (j = 1; j <= n; j++)
{
// 找一个距离src最近的点
if (!f[j] && dist[j] < temp)
{
u = j;
temp = dist[j];
}
}
f[u] = 1;
for (j = 1; j <= n; j++)
{
if (!f[j] && g[u][j] < INT_MAX)
{
if (dist[u] + g[u][j] < dist[j])
{
dist[j] = dist[u] + g[u][j];
money[j] = cost[u][j] + money[u];
}
else if (dist[u] + g[u][j] == dist[j] && cost[u][j] + money[u] < money[j])
money[j] = cost[u][j] + money[u];
}
}
}
cout << dist[dst] << " " << money[dst] << endl;
}
return 0;
}
hduoj_3790(dijkstra变形题)
最新推荐文章于 2020-01-25 18:29:58 发布