Stockbroker Grapevine(AC) Dijkstra算法
#include <iostream>
#include <memory.h>
using namespace std;
int weight[101][101], dis[101], pi[101];
int visit[101] = {0};
int minTime = 10000, vertexNum = 0;
void input()
{
int p = 0, cost = 0;
for (int j=1; j<=vertexNum; j++)
{
cin >> weight[j][0];
for (int i=1; i<=weight[j][0]; i++)
{
cin >> p >> cost;
weight[j][p] = cost;
}
}
}
void Relax(int u, int v)
{
if (dis[v] > dis[u] + weight[u][v])
{
dis[v] = dis[u] + weight[u][v];
pi[v] = u;
}
}
void Dijkstra(int s)
{
for (int i=0; i<=100; i++)
{
dis[i] = 10000;
pi[i] = -1;
visit[i] = 0;//千万不要忘了在初始化的时候将保存“访问标记”的数组 visit 也清空;
}
dis[s] = 0;
int minimum = 1000;
int j;
for (int k=1; k<=vertexNum; k++)
{
minimum = 1000;
for (int i=1; i<=vertexNum; i++)
if (dis[i] <= minimum && !visit[i])//不要忘了这里有等号,是 ”<=“,而不是 ”<“,因为可能有两个点到源点的距离相同,只能分先后访问,不能只访其一;
{
j = i;
minimum = dis[i];
}
visit[j] = 1;
for (int i=1; i<=100; i++)
if (weight[j][i] != 10000)
Relax(j, i);
}
}
int main()
{
int ss = 0;
int maxTime = 0;
while (cin >> vertexNum, vertexNum)
{
ss = 0;
minTime = 10000;
memset(visit , 0, sizeof(visit));
for (int i=0; i<101; i++)
{
for (int j=0; j<101; j++)
{
weight[i][j] = 10000;
}
}
input();
for (int s=1; s<=vertexNum; s++)
{
Dijkstra(s);
maxTime = 0;
for (int i=1; i<=vertexNum; i++)
{
if (dis[i] >= maxTime)
maxTime = dis[i];
}
if (maxTime < minTime)
{
minTime = maxTime;
ss = s;
}
}
if (minTime != 10000)
cout << ss << ' ' << minTime << endl;
else
cout << "disjoint" << endl;
}
return 0;
}
使用 Dijkstra 算法,效率会比 Bellman Ford 算法高些,但写的算法有问题,直到今天才找到,在代码中作了注释,其他的与前一篇相同。由于没有使用数组来保存边的信息,而是用直接检查邻接矩阵的方法,代码简洁了许多。visit 数组定义为局部数组或许更好,那样的话就不用考虑初始化时清空的问题了。

浙公网安备 33010602011771号