算法15讲——Path in Graph

一、Single Source Shortest Paths(单源最短路径)

Dijkstra’s algorithm

  1. 对于一个uniformly weighted graph(权值均相同的图),只需要BFS就可以得到。
  2. Dijkstra’s algorithm
Void shortestPaths(EdgeList[] adjInfo, int n, int s, int[] parent, float[]fringeWgt)
    int[] status = new int[n+1];
    MinPQ pq = create(n, status, parent, fringeWgt);
    insert(pq, s, ‐1, 0);
    while(isEmpty(pq)==false)
        int v = getMin(pq);
        deleteMin(pq);
        updateFringe(pq, adjInfo[v], v);

void updateFringe(MinPQ pq, EdgeList adjInfoOfV, int v)
    float myDist = pq.fringeWgt[v];
    EdgeList remAdj;
    remAdj = adjInfoOfV;
    while{remAdj != nil}
        EdgeInfo wInfo = first(remAdj);
        int w = wInfo.to;
        float newDist = myDist + wInfo.weight;
        if(pq.status[w]==unseen)
            insert(pq,w,v,newDist);
        else if(pq.status[w] = fringe)
            if(newDist < getPriority(pq,w))
                decreaseKey(pq,w,v,newDist);
        remAdj = rest(remAdj);
    return;

正确性证明

二、All‐pairs Shortest Path(多源最短路径)

Dijkstra’s 框架延伸

  1. Single‐source shortest path (SSSP)单源最短路径
  2. SSSP + node weight constraint
  3. SSSP + capacity constraint

Warshall’s algorithm

void simpleTransitiveClosure(boolean[][] A, int n, boolean[][] R)
    int i,j,k;
    Copy A to R;
    Set all main diagonal entries, rii, to true;
    while (any entry of R changed during one complete pass)
    for (k=1; k<=n; k++)
        for (i=1; i<=n; i++)
            for (j=1; j<=n; j++)
                rij=rij | (rik & rkj)

Floyd’s algorithm

Void allPairsShortestPaths(float [][] W, int n, float [][] D)
    int i, j, k;
    Copy W into D;
    for (k=1; kn; k++)
        for (i=1; in; i++)
            for (j=1; jn; j++)
                D[i][j] = min (D[i][j], D[i][k]+D[k][j]);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值