zoukankan      html  css  js  c++  java
  • bellman_ford算法

    给定一个源点,求最短路径,那么存在以源点为根的最短路径树
    因为最短路径具有最优子结构的性质,所以我们可以先求出树的第一层,然后再求出树的第二层,以此类推
    bellman_ford算法就是按照这种思想求最短路径的。
    因为树最多有n-1层,所以只要n-1次循环即可,每次循环i访问所有的边,然后松弛路径,就求出了第i层的最短路径。
    那么很明显,该算法的时间复杂度为O(VE)

    http://acm.fafu.edu.cn/problem.php?id=1473

     1 #include <stdio.h>
     2 #include <string.h>
     3 const int N = 2000+10;
     4 const int INF = 1<<30;
     5 struct Edge
     6 {
     7     int u,v,weight;
     8 }g[4000000];
     9 int dist[N];
    10 void relax(int u, int v,int weight)
    11 {
    12     if(dist[v] > dist[u] + weight)
    13         dist[v] = dist[u] + weight;
    14 }
    15 void bellman_ford(int n, int m)
    16 {
    17     int i,j;
    18     for(i=0; i<n-1; ++i)//n-1循环
    19         for(j=0; j<m; ++j)//枚举所有的边去松弛最短路径
    20         {
    21             relax(g[j].u,g[j].v,g[j].weight);
    22         }    
    23 }
    24 int main()
    25 {
    26     int n,m,a,b,c,i;
    27     while(scanf("%d%d",&n,&m)!=EOF)
    28     {
    29         for(i=1; i<=n; ++i)
    30             dist[i] = INF;
    31         for(i=0; i<m; ++i)
    32         {
    33             scanf("%d%d%d",&g[i].u,&g[i].v,&g[i].weight);
    34             if(g[i].u==1)
    35                 dist[g[i].v] = g[i].weight;
    36         }        
    37         bellman_ford(n,m);
    38         for(i=2; i<=n; ++i)
    39             printf("%d
    ",dist[i]);
    40     }        
    41     return 0;
    42 }
  • 相关阅读:
    hibernate关联关系
    数据结构之二叉树java实现
    队列java实现
    栈java实现
    原生JS结合cookie实现商品评分组件
    JAVA学习第一阶段(2)
    JAVA学习第一阶段(1)
    如何修改hosts并保存
    运行Apache时出现the requested operation has failed
    实现一元多项式
  • 原文地址:https://www.cnblogs.com/justPassBy/p/4116525.html
Copyright © 2011-2022 走看看