Bellman算法模板

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <algorithm>
 4 using namespace std;
 5 const int inf=1<<29;
 6 const int N=1001;
 7 int w[N][N],d[N];
 8 int u,v,c,m,n;
 9 struct node
10 {
11     int from;
12     int to;
13     int c;
14 }e[N*N];
15 bool Bellman_ford(int st)
16 {
17     for(int i=1;i<=n;i++)
18     {
19         d[i]=inf;
20     }
21     d[st]=0;
22     for(int i=1;i<n;i++)
23     {
24        for(int j=0;j<=2*m;j++)
25        {
26            if(d[e[j].to]>d[e[j].from]+e[j].c)
27             d[e[j].to]=d[e[j].from]+e[j].c;
28        }
29     }
30     for(int i=0;i<2*m;i++)//如果持续更新,则抛出错误
31         if(d[e[i].to]>d[e[i].from]+e[i].c)
32         return true;
33     return false;
34 }
35 int main()
36 {
37     while(scanf("%d%d",&n,&m)!=EOF)
38     {
39         for(int i=0;i<2*m;i+=2)//人为付成无向图
40         {
41            scanf("%d%d%d",&e[i].from,&e[i].to,&e[i].c);
42            e[i+1].from=e[i].to;
43            e[i+1].to=e[i].from
44            e[i+1].c=e[i].c;
45         }
46         if(Bellman_ford(1))
47             printf("-1\n");//并不是能计算负权值,而是能将存在负权值得情况报出出错误
48         else
49         {
50             for(int i=2;i<=n;i++)
51                 printf("%d %d\n",i,d[i]);
52         }
53     }
54     return 0;
55 }
时间: 2024-08-14 07:54:33

Bellman算法模板的相关文章

最短路 - 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算法详解)

首先介绍一下bellman算法: Bellman-ford算法是求含负权图的单源最短路径算法,效率很低,但代码很容易写.即进行持续地松弛(原文是这么写的,为什么要叫松弛,争议很大),每次松弛把每条边都更新一下,若n-1次松弛后还能更新,则说明图中有负环,无法得出结果,否则就成功完成.Bellman-ford算法有一个小优化:每次松弛先设一个标识flag,初值为FALSE,若有边更新则赋值为TRUE,最终如果还是FALSE则直接成功退出.Bellman-ford算法浪费了许多时间做没有必要的松弛,

tarjan算法模板

var {left表示点 root 没离开栈 vis表示点 root 有没有被访问过} i,n,m,now,time,color,top:longint; v:array[0..10001] of record start:longint;end; e:array[0..100001] of record y,next:longint;end; dfn,low,stack,encolor:array[0..10001] of longint; vis,left:array[0..10001] o

prim算法模板

var g:array[1..10,1..10] of longint; d:array[1..10] of longint; f:array[1..10] of boolean; procedure prim; var i,j,k,min:longint; begin fillchar(g,sizeof(g),0); fillchar(f,sizeof(f),0); for i:=1 to n do d[i]:=g[1,i]; f[1]:=true; for i:=2 to n do begi

bellman-ford算法模板

有SPFA模板,bellman-ford模板显然是多余的. var e:array[1..maxe]of record a,b,w:longint;end; { 距源点s距离 } dis:array[1..maxn]of longint; { 前驱 } pre:array[1..maxn]of longint; m,n,s:longint; procedure relax(u,v,w:longint); begin if dis[u]+w<dis[v] then begin dis[v]:=di

Floyd判最小环算法模板

算法思想:如果存在最小环,会在编号最大的点u更新最短路径前找到这个环,发现的方法是,更新最短路径前,遍历i,j点对,一定会发现某对i到j的最短路径长度dis[i][j]+mp[j][u]+mp[u][i] != INF,这时i,j是图中挨着u的两个点,因为在之前最短路更新过程中,u没有参与更新,所以dis[i][j]所表示的路径中不会出现u,如果成立,则一定是一个环.用Floyd算法来实现.但是对于负环此算法失效,因为有负环时,dis[i][j]已经不能保证i到j的路径上不会经过同一个点多次了.

hdu 1711 KMP算法模板题

题意:给你两个串,问你第二个串是从第一个串的什么位置開始全然匹配的? kmp裸题,复杂度O(n+m). 当一个字符串以0为起始下标时.next[i]能够描写叙述为"不为自身的最大首尾反复子串长度". 当发生失配的情况下,j的新值next[j]取决于模式串中T[0 ~ j-1]中前缀和后缀相等部分的长度, 而且next[j]恰好等于这个最大长度. 防止超时.注意一些细节.. 另外:尽量少用strlen.变量记录下来使用比較好,用字符数组而不用string //KMP算法模板题 //hdu

HDU 2544 最短路(我的dijkstra算法模板、SPAFA算法模板)

思路:这道题是基础的最短路径算法,可以拿来试一下自己对3种方法的理解 dijkstra主要是从第一个点开始枚举,每次枚举出当当前最小的路径,然后再以那最小的路径点为起点,求出它到其它未标记点的最短距离 bellman-ford 算法则是假设有向网中有n 个顶点.且不存在负权值回路,从顶点v1 和到顶点v2 如果存在最短路径,则此路径最多有n-1 条边.这是因为如果路径上的边数超过了n-1 条时,必然会重复经过一个顶点,形成回路:而如果这个回路的权值总和为非负时,完全可以去掉这个回路,使得v1到v

kruskal 算法模板

http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2896 #include <stdio.h> #include <string.h> #include <stdlib.h> struct node { int u,v,w; }q[200001]; int bin[50001]; int n,m,ans; int cmp(const void *a,const void