• 题目1008:最短路径问题(SPFA算法)


    问题来源

      http://ac.jobdu.com/problem.php?pid=1008

    问题描述

      给定一个G(V,E)有向图,起点s以及终点t,求最短路径。

    问题分析

      典型的单源最短路径问题,可以有多种方法完成。代码中采用的是SPFA算法。

      注意:这里面在相等的最短路径时,要去花费最小的那条,需要多比较一下。

      另外,我写了一篇最短路径四大算法总结,请参考:http://www.cnblogs.com/AlvinZH/p/6789912.html

    参考代码

    //
    // Created by AlvinZH on 2017/4/29.
    // Copyright (c) AlvinZH. All rights reserved.
    //
    
    #include <iostream>
    #include <cstdio>
    #include <string>
    #include <queue>
    using namespace std;
    
    #define MAX 1010
    #define INF 0x3f3f3f3f
    
    int dis[MAX];//dis[i]表示起点到i的最短距离
    int cost[MAX];//cost[i]表示起点到i的花费
    bool vis[MAX];//是否访问过点i
    
    struct node
    {
        int dis,cost;
    }map[MAX][MAX];
    
    int n,m,a,b,d,p,s,t;
    
    void SPFA()
    {
        for(int i=1;i<=n;i++)//初始化
        {
            dis[i]=INF;
            cost[i]=INF;
            vis[i]=false;
        }
        queue<int> q;
        q.push(s);
        dis[s]=0;
        cost[s]=0;
        vis[s]=true;
    
        while(!q.empty())
        {
            int cur=q.front();
            q.pop();
            vis[cur]=false;
            for(int i=1;i<=n;i++)
            {
                if(map[cur][i].dis!=INF&&dis[i]>=dis[cur]+map[cur][i].dis)
                {
                    dis[i]=dis[cur]+map[cur][i].dis;
                    cost[i]=min(cost[i],cost[cur]+map[cur][i].cost);
                    if(!vis[i])
                    {
                        vis[i]=true;
                        q.push(i);
                    }
                }
            }
        }
    }
    int main()
    {
        while(~scanf("%d%d",&n,&m)&&n&&m)
        {
            for(int i=1;i<=n;i++)
                for(int j=1;j<=n;j++)
                {
                    map[i][j].dis=INF;
                    map[i][j].cost=INF;
                }
    
            for(int i=1;i<=m;i++)
            {
                scanf("%d%d%d%d",&a,&b,&d,&p);
                map[a][b].dis=map[b][a].dis=d;
                map[a][b].cost=map[b][a].cost=p;
            }
            scanf("%d%d",&s,&t);
            SPFA();
            printf("%d %d
    ",dis[t],cost[t]);
        }
        return 0;
    }

    作者: AlvinZH

    出处: http://www.cnblogs.com/AlvinZH/

    本人Github:https://github.com/Pacsiy/JobDu

    本文版权归作者AlvinZH和博客园所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.

  • 相关阅读:
    HDNOIP普及+提高整合
    [BZOJ4016][FJOI2014]最短路径树问题
    [BZOJ3697]采药人的路径
    [COJ0985]WZJ的数据结构(负十五)
    [KOJ6024]合并果子·改(强化版)
    [KOJ6023]合并果子·改
    [KOJ0574NOIP200406合并果子]
    Atomic operations on the x86 processors
    Javascript 严格模式详解
    const C语言(转)
  • 原文地址:https://www.cnblogs.com/AlvinZH/p/6785034.html
Copyright © 2020-2023  润新知