题目大意十分简单,就是给你m条边的距离,让你求从1到n的最短路径.
解题思路:这是我第一次用spfa算法解题,学习spfa算法的心得都在代码注释里,若理解不对还请大牛们指出,谢谢啦。
#include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; #define inf 1<<29 typedef struct Node { int c; int u; int v; }; Node nodes[4005]; int head[1005],next[4005],dist[1005]; bool visited[1005]; int num[1005];//用来判断是否存在负环,如果一个顶点入队超过n的话就说明有负环 int n,m; int a1,a2,a3,e,sum; void add_node(int u,int v,int c) { nodes[e].u=u; nodes[e].v=v; nodes[e].c=c; next[e]=head[u]; //在这里可以解释为什么spfa算法可以避免重边 head[u]=e; //因为这里是将节点插入到起始节点之前,若有重边,则会查到原来已经插入的节点的前面 e++; } bool relax(int u,int v,int c) { if(dist[v]>dist[u]+c) { dist[v]=dist[u]+c; return true; } return false; } bool spfa() { queue<int>que; for(int i=2;i<=n;i++) { dist[i]=inf; } dist[1]=0;visited[1]=true; que.push(1); while(!que.empty()) { int q=que.front(); que.pop(); visited[q]=false; for(int i=head[q];i+1;i=next[i])//从q的头结点开始不断地往该邻接表的下一节点进行遍历 { //若节点有更新则入队并标记为true,因为最短路肯定是由上一个被更新的节点得来的 if(relax(q,nodes[i].v,nodes[i].c)&&!visited[nodes[i].v])//注意这里一定要先松弛,在进行标记判断 {//因为有可能这个点已经被松弛过并入队列了,但找到一个更好的点到该点的距离更短,那也需要进行松弛 if(++num[nodes[i].v]>n) //说明存在负环 return false; que.push(nodes[i].v);//没有负环则入队列 visited[nodes[i].v]=true; } } } return true; } int main() { while(scanf("%d%d",&m,&n)!=EOF) { sum=0; e=1; memset(nodes,0,sizeof(nodes)); memset(head,-1,sizeof(head)); memset(next,-1,sizeof(next)); memset(visited,false,sizeof(visited)); for(int i=0;i<m;i++) { scanf("%d%d%d",&a1,&a2,&a3); add_node(a1,a2,a3);//因为是无向边,因此要加两次节点 add_node(a2,a1,a3); } spfa(); printf("%d\n",dist[n]); } return 0; }
相关推荐
SPFA(Shortest Path Faster Algorithm)算法是一种用于解决图论中的单源最短路径问题的算法,它是贝尔曼-福特(Bellman-Ford)算法的一种优化版本,主要应用于求解带有负权重边的图的最短路径。SPFA通过使用队列...
【标题】"poj acm 题解 算法"所指的是一份针对ACM(国际大学生程序设计竞赛)中POJ(Problemset Online Judge)平台上的题目进行解答的资源集合。ACM竞赛是全球范围内的一项编程竞赛,旨在提升大学生的算法设计和...
在编程竞赛领域,POJ(Programming Online Judge)是一个广受欢迎的在线编程平台,它提供了许多题目供参赛者解决,以提升编程和算法能力。本文主要关注的是“POJ中级图算法”的一系列题目及其解题报告和AC(Accepted...
POJ算法分类和题目推荐指南 本资源主要介绍了POJ(Online Judge)平台上各种算法分类和推荐题目,涵盖了动态规划、模拟、博弈等多种类型。以下是详细的知识点说明: 一、动态规划 动态规划是一种非常重要的算法...
POJ 算法题目分类 POJ 算法题目分类是指分类所有 POJ 题目的算法思想和解决方案,本文将对算法分类进行详细的介绍。 一、基本算法 基本算法是指最基础的算法思想,如枚举、贪心、递归和分治法、递推、构造法、...
根据提供的文件信息,我们可以将POJ练习题中的算法进行分类,并对每一类中的知识点进行详细的阐述。POJ(Pacific Ocean Judge)是一个在线编程平台,它提供了丰富的编程题目,旨在帮助学习者掌握各种基础算法和数据...
POJ各题算法分类和题目推荐.pdf
【北大POJ初级-基本算法】是一系列针对北京大学在线编程平台POJ的初级算法题目解题报告和通过(AC)代码的集合。这个资源对于学习算法基础和提升编程能力非常有帮助,尤其适合初学者。POJ是许多计算机科学与技术专业...
在这个实验报告中,poj1087 题目就是一个典型的贪心算法应用实例。 题目描述了一个工厂需要将不同尺寸的产品(1*1 到 6*6)使用6*6的包裹进行包装,目标是最小化所需的包裹数量。贪心策略在此问题中的应用是逐个...
【北大POJ初级-图算法】是一系列针对北京大学在线编程平台POJ(Problem Online Judge)上的初级编程题目,重点在于图论算法的应用。这个解题报告集合了多种图算法的实现,帮助学习者掌握如何在实际问题中运用这些...
在本压缩包“poj算法题目实现.zip”中,包含了五个经典的编程竞赛题目,主要针对的是POJ(Programming Online Judge)平台。这些题目是程序员提升算法能力、锻炼编程技巧的重要资源。下面,我们将详细探讨每个题目...
标题中的“POJ 1078 算法”指的是北京大学在线判题系统(Problem Online Judge,简称POJ)中的第1077题,这通常是一个编程竞赛或者算法练习题目。POJ是一个供程序员练习算法、提交代码并获取运行结果的平台,主要...
【北大POJ中级-基本算法】解题报告与AC代码详解 北京大学的在线编程平台POJ(Problem Set of Peking University)是许多编程爱好者和学习者提升算法技能的重要平台。中级算法题目通常涵盖了一些基础但重要的算法...
根据提供的信息,我们可以将POJ(Peking Online Judge)平台上的算法题目按照不同的类别进行整理与解析。这对于希望系统性地提高自己算法能力的学习者来说非常有用。下面将基于给出的分类来详细介绍每一类算法的核心...
POJ上的一道题目,自己写的代码,因为想下载别人的, 所以就放上了。
该算法是融合了直接 SPFA 算法和 KM 重标号算法的优点,实现了最小费用流的计算。该算法的主要过程是反复交替进行最短路和最大流的计算,利用 Reduced Cost 缩小了费用范围,提高了算法的效率。 知识点: 1. 最小...
【标题】"poj.org算法题解集合"是关于在poj.org平台上解决的各种算法问题的集合,这个资源主要是为了帮助编程爱好者和学习者提升算法技能。poj.org是一个著名的在线编程竞赛平台,它提供了丰富的算法题目供用户实践...
根据给定的文件信息,以下是对“ACM-POJ算法训练指南”的详细解析与相关知识点的归纳: ### 一、基本算法 1. **排序**:包括了基础的排序算法,如快速排序(poj1753, poj2965),是算法学习的基础。 2. **搜索**:...
dijkstra 算法 需要考虑重边.........
标题 "POJ 1751 求最小生成树Prim算法(JAVA)" 提到的是一个编程挑战,涉及图论中的经典算法——Prim算法。在计算机科学中,Prim算法是用于寻找加权无向图的最小生成树的一种有效方法。最小生成树是一棵树形结构,...