`
暴风雪
  • 浏览: 385095 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

[SPFA]hdoj 3790:最短路径问题

阅读更多

大致题意:
    给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。

 

大致思路:
    最短路稍稍变形,加入一个val限制即可

 

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
using namespace std;
const int nMax=3050;
const int mMax=1000050;
const int inf=1<<28;
struct{
    int v, next;
    int  w,val;
}edge[mMax];
int n, k, edgeHead[nMax],rehead[nMax],rk;
int dis[nMax],issea[nMax];
int stack[nMax],m,val[nMax];
bool vis[nMax];

void addedge(int a,int b,int w,int val){
    edge[k].w = w;
    edge[k].v=b;
    edge[k].val=val;
    edge[k].next=edgeHead[a];
    edgeHead[a]=k;k++;
}

int spfa(int s){
    int i, top = 0;
    memset(vis,0,sizeof(vis));
    for(i=1;i<=n;i++){
        dis[i]=inf;
        val[i]=inf;
    }
    dis[s]=0;
    val[s]=0;
    stack[++top]=s;
    vis[s]=true;
    while(top){
        int u=stack[top--];
        vis[u]=false; /////////////////
        for(i=edgeHead[u];i!=0;i=edge[i].next){
            int v=edge[i].v;
            if(dis[v]>dis[u]+edge[i].w){
                dis[v]=dis[u]+edge[i].w;
                val[v]=val[u]+edge[i].val;
                if(!vis[v]){
                    vis[v]=true;
                    stack[++top] = v;
                }
            }
            if(dis[v]==dis[u]+edge[i].w&&val[v]>val[u]+edge[i].val){
                dis[v]=dis[u]+edge[i].w;
                val[v]=val[u]+edge[i].val;
                if(!vis[v]){
                    vis[v]=true;
                    stack[++top] = v;
                }
            }
        }
    }
    int sum=0;
    for(i=1;i<=n;i++){
        sum+=dis[i];
    }
    return sum;
}

int main(){
    int i,j,s,t,a,b,c,d;
    while(scanf("%d%d",&n,&m)&&(n||m)){
        k=1;
        memset(edgeHead,0,sizeof(edgeHead));
        while(m--){
            scanf("%d%d%d%d",&a,&b,&c,&d);
            addedge(a,b,c,d);
            addedge(b,a,c,d);
        }
        scanf("%d%d",&s,&t);
        spfa(s);
        cout<<dis[t]<<" "<<val[t]<<endl;
    }
    return 0;
}
 
0
1
分享到:
评论

相关推荐

    图论:最短路径+最小生成树+中心度计算

    Dijkstra算法是一种解决单源最短路径问题的经典方法,它通过维护一个优先队列来逐步扩展最短路径。SPFA(Shortest Path Faster Algorithm)则是另一种基于Bellman-Ford算法的启发式策略,尽管在某些情况下效率更高,...

    最短路径 之 SPFA算法

    SPFA最短路径算法 SPFA(Shortest Path Faster Algorithm)是一种单源最短路径算法,它的性能非常好,代码实现也并不复杂。特别是当图的规模大,用邻接矩阵存不下的时候,用 SPFA 则可以很方便地面对临接表。每个...

    SPFA算法求单源最短路径

    **SPFA(Shortest Path Faster Algorithm)算法是求解图中单源最短路径的一种算法,它是Bellman-Ford算法的一种优化版本。该算法由Liu Hui在1990年提出,主要应用于图论和网络流问题中。与Dijkstra算法不同,SPFA...

    最短路径_路径_matlab求最短路径_复杂网络_

    Matlab作为一种强大的数值计算和可视化工具,提供了多种求解最短路径的算法,使得处理复杂网络的最短路径问题变得更加便捷。 在给定的标题“最短路径_路径_matlab求最短路径_复杂网络_”中,我们可以理解这是一个...

    基于Dijkstra算法的最短路径问题求解.123

    ### 基于Dijkstra算法的最短路径问题求解 #### 一、Dijkstra算法简介 Dijkstra算法是由荷兰计算机科学家Edsger W. Dijkstra于1956年提出的一种用于解决加权图中单源最短路径问题的算法。该算法能够有效地找出从...

    三种算法(Floyd、Dijkstra、SPFA)求单源点最短路径。

    首先,Floyd-Warshall算法是一种动态规划方法,用于解决所有顶点对之间的最短路径问题。该算法的基本思想是通过逐步考虑所有的中间节点来更新所有可能的路径。对于一个有n个顶点的图,它的时间复杂度为O(n^3),适用...

    SPFA.rar_SPFA_最短路径

    SPFA(Shortest Path Faster ...总之,SPFA算法是一种有效的解决最短路径问题的方法,尤其在处理大规模图和含有负权边的图时,其性能表现通常优于其他算法。在实际应用中,可以根据具体问题的特性选择合适的算法。

    求单源点最短路径效率很高的spfa算法

    SPFA(Shortest Path Faster Algorithm)是一种用于解决图论中的单源最短路径问题的算法,由姚一兆提出。相比于Dijkstra算法,SPFA在处理某些稠密图时表现出更高的效率,尽管它不是一种确定性的算法,但在实际应用中...

    最短路径问题

    为了提高效率,最短路径问题还有许多变种和优化,如SPFA(Shortest Path Faster Algorithm)和Johnson's Algorithm,它们在特定条件下可以更快地找到最短路径。此外,随着并行计算和分布式系统的进步,分布式版本的...

    关于最短路径的SPFA快速算法_段凡丁1

    SPFA(Shortest Path Faster Algorithm)是一种用于解决图中单源最短路径问题的算法,由段凡丁在1994年提出。它采用了动态优化逼近的思想,相比于经典的Dijkstra算法,在某些情况下表现出更好的时间复杂性。 在...

    最短路径问题的算法

    最短路径问题在计算机科学和图论中是一个关键议题,主要目标是找出网络中的两个节点之间最短的路径。这个问题广泛应用于路由选择、交通规划、社交网络分析等多个领域。最短路径算法通常处理的是带有权重的图,这些...

    spfa.rar_SPFA_visual c_求最短路径

    本代码示例是用C++语言实现的SPFA算法,适用于求解带负权边的图的最短路径问题。** ### SPFA算法概述: SPFA算法的核心思想是使用队列数据结构来优化Bellman-Ford算法,通过批量处理可能的松弛操作,减少了重复计算...

    SPFA.zip_SPAF算法_SPFA_最短路径

    SPFA(Shortest Path Faster Algorithm,最短路径更快算法)是一种用于解决图论问题中的单源最短路径问题的算法,由姚一鸣提出。它与Dijkstra算法类似,但比Dijkstra算法在某些情况下效率更高。Dijkstra算法是基于...

    python实现最短路径的实例方法

    Python 实现最短路径的实例方法主要涉及到图论和算法,特别是解决网络中两点之间最高效、最低成本的路径问题。下面将详细讲解三种常用的算法:迪杰斯特拉算法(Dijkstra算法)、弗洛伊德算法(Floyd算法)以及SPFA...

    java spfa 算法 demo 最短路径双向

    现在网上有很多最短路径的算法,C++版本的较多,java可用的demo较少,或者不支持双向的,这里总结了java版的spfa算法,个人认为此算法比较实用(拓扑、GIS定位等项目上),本算法支持双向,有兴趣的可以下载下来研究...

    C语言最短路径算法实现

    Floyd-Warshall算法是一种解决所有对最短路径问题的动态规划方法。它通过考虑所有可能的中间节点,逐步更新图中任意两点之间的最短路径。C语言实现时,可以创建一个二维数组来表示图的邻接矩阵,并用三层循环遍历...

    选路算法 最短路径

    最短路径选路算法在计算机科学和网络工程领域中占据着至关重要的地位,它主要用于解决网络数据传输时如何选择最优路径的问题。这类算法确保了数据在网络中的高效、可靠传输,对于提升网络性能和优化资源利用至关重要...

    用Java编写的最短路径代码

    在计算机科学中,最短路径问题是一个经典的图论问题,主要目标是找到网络中的两个节点之间具有最低成本或最短距离的路径。这个问题在许多领域都有应用,如交通规划、网络设计、数据传输等。本篇文章将深入探讨如何...

    CJ2-12-图论最短路径问题- 弗洛伊德(floyd)算法.pdf

    ### 图论最短路径问题——弗洛伊德(Floyd)算法 #### 一、引言 在图论中,寻找最短路径问题是一项基础而重要的任务。它不仅应用于理论研究,还在诸如网络路由、物流配送等领域有着广泛的实际应用。本文将详细介绍...

    SPFA[知乎:叶枝黎曼].py

    SPFA[知乎:叶枝黎曼].py

Global site tag (gtag.js) - Google Analytics