最短路径

P4779 【模板】单源最短路径(标准版)

匿名 (未验证) 提交于 2019-12-03 00:00:02
P4779 【模板】单源最短路径(标准版) 题目入口: P4779 【模板】单源最短路径(标准版) 使用 【堆优化Dijkstra求最短路】模版 代码 //---------使用模版前言--------- //注意顶点数MAXN的值 注意极大数据inf的值 # include <iostream> # include <cstdio> # include <cstring> # include <queue> # include <utility> # include <algorithm> # include <vector> # define MAXN 300010 //最大顶点数 # define inf 1e9+10 //极大数据 using namespace std ; typedef pair < int , int > info ; //存放当前点及从源点到当前点的最短路径的信息 priority_queue < info , vector < info > , greater < info > > Q ; //优先队列实现将已确定最短路径的点放入队列 小顶堆实现堆优化 struct edge { //定义弧信息 int to ; //弧指向的点 int weight ; //弧的权重 edge ( int t , int w ) : to ( t ) ,

最短路径

匿名 (未验证) 提交于 2019-12-02 23:51:01
<前导> 这里回顾四种计算最短路径的算法,分别为: Floyd算法; Dijkstra算法; Bellman-Ford算法; SPFA算法; <Floyd算法> Floyd算法的实现非常简单,直接看代码: int d[maxn][maxn];//d[i][j]表示顶点i、j之间的最短距离 int inf=99999999; for(int i=0;i<maxn;i++){ d[i][i]=0; //初始化 } void Floyd(){ for(int k=0;k<n;k++){ //注意Floyd算法先循环中转点k for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ if(d[i][k]<inf&&d[k][j]<inf&&d[i][k]+d[k][j]<d[i][j]) d[i][j]=d[i][k]+d[k][j]; } } } } <dijkstra算法> //以邻接矩阵为例 bool book[maxn]={false}; int d[maxn]; int G[maxn][maxn];//注意G也需要初始化,除了输入的边之外,其余不连通的边全部设为inf int n,inf=99999999; void Dijkstra(int s){ for(int i=0;i<maxn;i++){ d[i]=inf;//初始化 } d[s]=0;

Floyd算法(全源最短路径)

匿名 (未验证) 提交于 2019-12-02 23:41:02
1. Floyd算法是用来解决全源最短路径的问题,即给定图G(V,E),求任意两点u,v之间的最短路径长度,算法的思想比较简单,如果存在顶点k,使得以k作为中间顶点时顶点i和顶点j的当前最短距离缩短,则将dis[i][j]更新为dis[i][k] + dis[k][j],由于存在三层循环所以时间复杂度是O(n ^ 3),n为顶点的数量 2. 需要注意的问题是最外层的k循环不能够放入到最里面,因为后面的有可能更新到某一个顶点的时候,前面的顶点i,j顶点已经访问过了,所以不能够再访问了导致有的结果是错误的,所以k循环要放到最外面 下面是有向有权图的例子: 3. 具体的代码如下: import java.util.Arrays; import java.util.Scanner; public class Floyd算法 { static int d[][]; static int n = 0; static int edges; public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("输入顶点的个数: "); n = sc.nextInt(); d = new int[n][n]; System.out.println("输入边的条数: ");

最短路径(迪杰斯特拉算法)

匿名 (未验证) 提交于 2019-12-02 23:40:02
源代码: #include<stdio.h> #define MaxInt 32767 //表示极大值 #define MVNum 100 //最大顶点数 typedef char VerTexType; //定义数据类型 typedef int ArcType; typedef struct { VerTexType vexs[MVNum]; //顶点表 ArcType arcs[MVNum][MVNum];//邻接矩阵 int vexnum,arcnum; //图的点数和边数 }AMGraph; int LocateVex(AMGraph G,char v)//确定V在G中的位置 { int i; for(i = 0; i < G.vexnum; i++) { if(G.vexs[i] == v) //如果找到,返回其序号 break; } return i; } int CreateUDN(AMGraph &G) { int v1,v2,w,i,j; printf(“请输入总顶点数和总边数:”); scanf("%d %d",&G.vexnum,&G.arcnum); printf(“请输入点的信息:\n”); for(i = 0; i < G.vexnum; i++) scanf(" %c",&G.vexs[i]); for(i = 0;i < G.vexnum;i++)

洛谷P3371 【模板】单源最短路径(弱化版)(SPFA解法)

匿名 (未验证) 提交于 2019-12-02 23:05:13
题目背景 P4779 。 题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度。 输入输出格式 输入格式: 第一行包含三个整数N、M、S,分别表示点的个数、有向边的个数、出发点的编号。 接下来M行每行包含三个整数Fi、Gi、Wi,分别表示第i条有向边的出发点、目标点和长度。 输出格式: 一行,包含N个用空格分隔的整数,其中第i个整数表示从点S出发到点i的最短路径长度(若S=i则最短路径长度为0,若从点S无法到达点i,则最短路径长度为2147483647) 输入输出样例 4 6 1 1 2 2 2 3 2 2 4 1 1 3 5 3 4 3 1 4 4 0 2 4 3 说明 时空限制:1000ms,128M 数据规模: 对于20%的数据:N<=5,M<=15; 对于40%的数据:N<=100,M<=10000; 对于70%的数据:N<=1000,M<=100000; 对于100%的数据:N<=10000,M<=500000。保证数据随机。 P4779 。请注意,该题与本题数据范围略有不同。 SPFA思想: AC代码: 1 #include<iostream> 2 #include<queue> 3 #include<algorithm> 4 #include<cstring> 5 using namespace std; 6 int n,m,s,first

最短路径问题 Dijkstra ――Python实现

匿名 (未验证) 提交于 2019-12-02 22:51:30
1 class Vertex: 2 #顶点类 3 def __init__(self,vid,outList): 4 self.vid = vid #出边 5 self.outList = outList #出边指向的顶点id的列表,也可以理解为邻接表 6 self.know = False #默认为假 7 self.dist = float('inf') #s到该点的距离,默认为无穷大 8 self.prev = 0 #上一个顶点的id,默认为0 9 def __eq__(self, other): 10 if isinstance(other, self.__class__): 11 return self.vid == other.vid 12 else: 13 return False 14 def __hash__(self): 15 return hash(self.vid) 1 #创建顶点对象 2 v1=Vertex(1,[2,3]) 3 v2=Vertex(2,[3,4]) 4 v3=Vertex(3,[5]) 5 v4=Vertex(4,[3,5,6]) 6 v5=Vertex(5,[6]) 7 v6=Vertex(6,[]) 8 9 #存储边的权值 10 edges = dict() 11 def add_edge(front,back,value): 12

【图论】Floyd找无向图最小环

六月ゝ 毕业季﹏ 提交于 2019-12-02 16:13:23
Floyd求无向图最小环 算法思想 如果若干个点形成一个环,则该环对应的有限点集V一定含有最大编号的点Kmax,按编号小到大枚举这个最大点k。 枚举时,以k为外层循环,每层循环考虑: 只经过前k-1个点的i,j间最短路径d[i][j],连接i,k的边g[i][k],连接k,j的边g[k][j],若d[i][j]+g[i][k]+g[k][j]<mn,则更新最小环的长度,同时记录路径,该环路径包含了曾经的k-1个点中的最短路上的点,也包括i,j,k三点,放入答案数组中即可。 若要统计最小环的个数,则可以在mn==d[i][j]+g[i][k]+g[k][j]时计数,要注意,如果mn在后续被更新,该计数个数要重置。 变量定义 d[i][j]:从i到j的最短路径长 g[i][j]:连接i和j的最小边长(直接相连) pos[i][j]:在Floyd中更新了i,j间最短路径的点 mn: 最小环的长度 代码 POJ 1734(模板题) #include<cstdio> #include<iostream> #include<vector> using namespace std; const int maxn=101; const int _INF=0x7fffffff; const int INF=_INF/3; int n,m; int d[maxn][maxn],g[maxn][maxn

PAT甲级1030

半世苍凉 提交于 2019-12-02 14:59:02
1030 Travel Plan (30 point(s)) 题目原文   A traveler’s map gives the distances between cities along the highways, together with the cost of each highway. Now you are supposed to write a program to help a traveler to decide the shortest path between his/her starting city and the destination. If such a shortest path is not unique, you are supposed to output the one with the minimum cost, which is guaranteed to be unique. Input Specification:   Each input file contains one test case. Each case starts with a line containing 4 positive integers N, M, S, and D, where N (≤500) is the number of cities

C语言常用算法

自古美人都是妖i 提交于 2019-12-02 14:32:23
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过不错的文章给大家。大家也可以留言区补充。 一、算法最最基础 1、时间复杂度 2、空间复杂度 一般最先接触的就是时间复杂度和空间复杂度的学习了,这两个概念以及如何计算,是必须学的,也是必须最先学的,主要有最大复杂度、平均复杂度等,直接通过博客搜索学习即可。 文章推荐: 算法分析神器—时间复杂度 二、基础数据结构 1、线性表 列表(必学) 链表(必学) 跳跃表(知道原理,应用,最后自己实现一遍) 并查集(建议结合刷题学习) 不用说,链表、列表必须,不过重点是链表。 三分钟基础数据结构:如何轻松手写链表? 以后有面试官问你「跳跃表」,你就把这篇文章扔给他 2、栈与队列 栈(必学) 队列(必学) 优先队列、堆(必学) 多级反馈队列(原理与应用) 特别是优先队列,再刷题的时候,还是经常用到的,队列与栈,是最基本的数据结构,必学。可以通过博客来学习。相关文章: 三分钟基础知识:什么是栈?

洛谷P1821《[USACO07FEB]银牛派对Silver Cow Party》

江枫思渺然 提交于 2019-12-02 12:27:21
原创建时间:2018-07-20 12:57:21 巧妙地把单终点最短路径问题转化为单源最短路径问题 题目地址 题目描述 寒假到了,N头牛都要去参加一场在编号为X(1≤X≤N)的牛的农场举行的派对(1≤N≤1000),农场之间有M(1≤M≤100000)条有向路,每条路长Ti(1≤Ti≤100)。 每头牛参加完派对后都必须回家,无论是去参加派对还是回家,每头牛都会选择最短路径,求这N头牛的最短路径(一个来回)中最长的一条路径长度。 Input/Output 格式 & 样例 输入格式: 第一行三个整数N,M, X; 第二行到第M+1行:每行有三个整数Ai,Bi, Ti ,表示有一条从Ai农场到Bi农场的道路,长度为Ti。 输出格式: 一个整数,表示最长的最短路得长度。 输入样例#1: 4 8 2 1 2 4 1 3 2 1 4 7 2 1 1 2 3 5 3 1 2 3 4 4 4 2 3 输出样例#1: 10 题目说明 图片来自洛谷 解题思路 单源最短路我们都会做,一遍 SPFA 或 Dijkstra 就行了。 单终点最短路呢? 对于这道题,奶牛们从派对分别回家就是一个单源最短路问题,而奶牛们从家到派对就是一个单终点最短路问题。 如何把单终点最短路转化为单源最短路问题? 注意:题目中建的是有向边 实在是想不出来的我翻了一波题解,发现他们都在输入的时候另建了一个图, 反向存边