oj2894(贝尔曼福特模板)

http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2894

就因为粗心,一中午没A,题目说是2000000条边无向图,我数组却开了2000000真是该死,我一看别人A的状态,内存都比我大一倍,瞬间知道自己手残了,明明是4000000啊,

但令我不解的是说SPFA是BE的改良版,但为什么7100ms,虐心,完全坑爹。

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 10000001
using namespace std;
struct node
{
    int x,y,w;
}edge[4000002];
int dis[500002];
int n,m,s,e;
int t,flag;
void add(int x1,int y1,int w1)
{
    edge[t].x=x1;
    edge[t].y=y1;
    edge[t++].w=w1;
}
void B()
{
    for(int i=0;i<=n;i++)
        dis[i]=N;
      dis[s]=0;
    for(int i=1;i<=n-1;i++)
    {
        flag=0;
        for(int j=0;j<t;j++)
        {
            if(dis[edge[j].x]+edge[j].w<dis[edge[j].y])
            {
                   flag=1;
                  dis[edge[j].y]=dis[edge[j].x]+edge[j].w;
            }
        }
        if(flag==0) break;
    }
    printf("%d\n",dis[e]);
}
int main()
{
    int xx,yy,zz;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        t=0;
        while(m--)
        {
            scanf("%d%d%d",&xx,&yy,&zz);
            add(xx,yy,zz);
            add(yy,xx,zz);
        }
        scanf("%d%d",&s,&e);
        B();
    }
    return 0;
}

/**************************************
    Problem id    : SDUT OJ 2894
    User name    : zlh130205张明成
    Result        : Accepted
    Take Memory    : 49344K
    Take Time    : 710MS
    Submit Time    : 2014-06-27 13:32:27
**************************************/

oj2894(贝尔曼福特模板),布布扣,bubuko.com

时间: 2024-12-29 01:44:34

oj2894(贝尔曼福特模板)的相关文章

最短路 Bellman-Ford(贝尔曼-福特)

Bellman-Ford(边权可正可负) Bellman-Ford算法的迭代松弛操作,实际上就是按顶点距离s的层次,逐层生成这棵最短路径树的过程. 在对每条边进行1遍松弛的时候,生成了从s出发,层次至多为1的那些树枝.也就是说,找到了与s至多有1条边相联的那些顶点的最短路径:对每条边进行第2遍松弛的时候,生成了第2层次的树枝,就是说找到了经过2条边相连的那些顶点的最短路径--.因为最短路径最多只包含n-1 条边,所以,只需要循环n-1 次. 如果最短路存在,则一定不含环: 1.存在零环或正环,则

贝尔曼福特算法

有边数限制,存在负权值,的最短路问题,一般用bellmanford算法: 给定一个n个点m条边的有向图,图中可能存在重边和自环, 边权可能为负数. 请你求出从1号点到n号点的最多经过k条边的最短距离,如果无法从1号点走到n号点,输出impossible. 注意:图中可能 存在负权回路 . 输入格式 第一行包含三个整数n,m,k. 接下来m行,每行包含三个整数x,y,z,表示存在一条从点x到点y的有向边,边长为z. 输出格式 输出一个整数,表示从1号点到n号点的最多经过k条边的最短距离. 如果不存

【算法日记】贝尔曼-福德算法

如上图使用Dijkstra算法将无法获取到最短路径 1.A->C->D   5 2.A->B...没有 最近路径为5.但是实际上B->C的路径为-2. A->B->C->D的最短开销为3 Dijkstra算法无法判断含负权边的图的最短路.如果遇到负权,在没有负权回路存在时(负权回路的含义是,回路的权值和为负.)即便有负权的边,也可以采用贝尔曼-福德算法算法正确求出最短路径. 算法实现 1 def bellman_ford( graph, source ): 2 3

最短路 - bellman-ford 算法模板

http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2894 谈一下对贝尔曼福特的认识(参考别人的) BF是对边进行操作,dijkstra 是对点进行操作,N个顶点的最短路最多是N-1条边,所以需要循环N-1次 1.初始化 2.迭代求解:反复对边集中的每条边进行松弛操作,使得顶点集v中的每个顶点vde最短距离逐步逼近其最短距离,运行v-1次 3:检验负权回路:判断边集中的每一条边的两个端点是否收敛,如果存在

[图论] 最短路径(Bellman-Ford , SPFA , Floyed , Dijkstra)

注:模板以hdu 2544 为例 Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据.每组数据第一行是两个整数N.M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路.N=M=

&lt;知识整理&gt;2019清北学堂提高储备D5

今天主讲图论. 前言:图的定义:图G是一个有序二元组(V,E),其中V称为顶集(Vertices Set),E称为边集(Edges set),E与V不相交.它们亦可写成V(G)和E(G). 一.图的存储: 1.邻接矩阵: 2.邻接表: 数组模拟链表实现:记录每条边的终点.边权(如果有的话).同一起点的上一条边的编号,并记录以每个点为起点的最后一条边的编号. STL中的vector:记录以每个点为起点的边. 一些vector的细节: vector 本质就是 c++ 模板库帮我们实现好的可以变长的数

POJ3259-Wormholes-( spfa || Bellman_Ford )

题意:有n块田,之间有m条无向边表示路径,权值表示走过需要花费的时间.有w对虫洞,虫洞是单向的,表示穿越一定时间到过去,并且回到虫洞指向的点,问一个人有没有可能通过虫洞回到某个起点,并且在从这个起点出发之前的时间,因为这样可以看到过去的自己. 解题:判断负圈,模板题. //记录一下模板 #include<stdio.h> #include<iostream> #include<algorithm> #include<cstring> #include<

图论概述和SPFA

图论概述和SPFA 2019-12-28 Powered by Gauss 1.图论——最短路 图论是信息学学习过程中不可或缺的一个部分.图论的应用是非常广泛的,在现实生活中大家处处都能遇到,例如电子地图,机票查询等. 现在的算法竞赛考试的范围是无边无际,但主要的考点也就是图论,DP,数论,字符串等等.图论是一大考点,例如: 题目 来源 最优贸易          NOIP2009提高组第三题 信息传递 NOIP2015提高组第二题 运输计划 NOIP2015提高组第六题 寻找道路 NOIP20

计算机网络常识

1.       OSI , TCP/IP ,五层协议的体系结构 OSI分层(7层) :物理层.数据链路层.网络层.传输层.会话层.表示层.应用层. TCP/IP分层(4层) :网络接口层.网际层.运输层.应用层. 五层协议(5层) :物理层.数据链路层.网络层.运输层.应用层. 每一层的作用如下 : 物理层:激活.维持.关闭通信端点之间的机械特性.电气特性.功能特性以及过程特性.该层为上层协议提供了一个传输数据的物理媒体. 数据链路层 :数据链路层在不可靠的物理介质上提供可靠的传输.该层的作用