The Algorithm Design Manual Second Edition


All-Pairs Shortest Path



Download 5,51 Mb.
Pdf ko'rish
bet171/488
Sana31.12.2021
Hajmi5,51 Mb.
#273936
1   ...   167   168   169   170   171   172   173   174   ...   488
Bog'liq
2008 Book TheAlgorithmDesignManual

6.3.2

All-Pairs Shortest Path

Suppose you want to find the “center” vertex in a graph—the one that minimizes

the longest or average distance to all the other nodes. This might be the best place

to start a new business. Or perhaps you need to know a graph’s diameter—the

longest shortest-path distance over all pairs of vertices. This might correspond to

the longest possible time it takes a letter or network packet to be delivered. These

and other applications require computing the shortest path between all pairs of

vertices in a given graph.

We could solve all-pairs shortest path by calling Dijkstra’s algorithm from each

of the possible starting vertices. But Floyd’s all-pairs shortest-path algorithm is

a slick way to construct this n

× n distance matrix from the original weight matrix

of the graph.

Floyd’s algorithm is best employed on an adjacency matrix data structure,

which is no extravagance since we must store all n

2

pairwise distances anyway.



Our adjacency matrix type allocates space for the largest possible matrix, and

keeps track of how many vertices are in the graph:

typedef struct {

int weight[MAXV+1][MAXV+1];

/* adjacency/weight info */

int nvertices;

/* number of vertices in graph */

} adjacency_matrix;

The critical issue in an adjacency matrix implementation is how we denote the

edges absent from the graph. A common convention for unweighted graphs denotes

graph edges by 1 and non-edges by 0. This gives exactly the wrong interpretation

if the numbers denote edge weights, for the non-edges get interpreted as a free ride

between vertices. Instead, we should initialize each non-edge to MAXINT. This way

we can both test whether it is present and automatically ignore it in shortest-path

There are several ways to characterize the shortest path between two nodes

in a graph. The Floyd-Warshall algorithm starts by numbering the vertices of the

graph from 1 to n. We use these numbers not to label the vertices, but to order

them. Define [i, j]



k

to be the length of the shortest path from to using only

vertices numbered from 12, ..., k as possible intermediate vertices.

What does this mean? When = 0, we are allowed no intermediate vertices,

so the only allowed paths are the original edges in the graph. Thus the initial

computations, since only real edges will be used, provided MAXINT is greater than

the diameter of your graph.



6 . 3

S H O R T E S T P A T H S



211

all-pairs shortest-path matrix consists of the initial adjacency matrix. We will per-

form iterations, where the kth iteration allows only the first vertices as possible

intermediate steps on the path between each pair of vertices and y.

At each iteration, we allow a richer set of possible shortest paths by adding a

new vertex as a possible intermediary. Allowing the kth vertex as a stop helps only

if there is a short path that goes through k, so

[i, j]

k

= min([i, j]



k

1

, W [i, k]

k

1

[k, j]



k

1

)

The correctness of this is somewhat subtle, and I encourage you to convince



yourself of it. But there is nothing subtle about how simple the implementation is:

floyd(adjacency_matrix *g)

{

int i,j;


/* dimension counters */

int k;


/* intermediate vertex counter */

int through_k;

/* distance through vertex k */

for (k=1; k<=g->nvertices; k++)

for (i=1; i<=g->nvertices; i++)

for (j=1; j<=g->nvertices; j++) {

through_k = g->weight[i][k]+g->weight[k][j];

if (through_k < g->weight[i][j])

g->weight[i][j] = through_k;

}

}



The Floyd-Warshall all-pairs shortest path runs in O(n

3

) time, which is asymp-



totically no better than calls to Dijkstra’s algorithm. However, the loops are so

tight and the program so short that it runs better in practice. It is notable as one of

the rare graph algorithms that work better on adjacency matrices than adjacency

lists.


The output of Floyd’s algorithm, as it is written, does not enable one to recon-

struct the actual shortest path between any given pair of vertices. These paths can

be recovered if we retain a parent matrix of our choice of the last intermediate

vertex used for each vertex pair (x, y). Say this value is k. The shortest path from



to is the concatenation of the shortest path from to with the shortest

path from to y, which can be reconstructed recursively given the matrix . Note,

however, that most all-pairs applications need only the resulting distance matrix.

These jobs are what Floyd’s algorithm was designed for.





Download 5,51 Mb.

Do'stlaringiz bilan baham:
1   ...   167   168   169   170   171   172   173   174   ...   488




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish