最短路径Bellman_ford

单源最短路径

思路:

循环n-1次,每次寻找出经过k条边到达其余点的最短路径,每次都遍历更新其余所有点。

时间复杂度O(nm)

Code:

#include<iostream>
#include<memory.h>
#include<cmath>
using namespace std;
struct ee{
    int u,v,w;//存放起点,终点,边权
}edge[100];//用于存放边
int n,m,s;
int dis[100][100];//dis[k][i]为最多经过k条边到达i点的最短距离
void bellman(int s)
{
    memset(dis,0x3f,sizeof(dis));
    for(int k=1;k<=n-1;k++)//n个点只需要n-1条边
    {
        for(int i=1;i<=m;i++)//每次遍历所有的边
        {
            int u=edge[i].u;
            int v=edge[i].v;
            int w=edge[i].w;
            //状态压缩
            dis[v]=min(dis[v],dis[u]+w);//更新经过u点是否到达v点距离更近
            //不状态压缩
            dis[k][v]=min(dis[k-1][v],dis[k-1][u]+w);//更新经过u点是否到达v点的距离更近
        }
    }
    return;
 } 
 int main()
 {
     cin>>n>>m>>s;
     for(int i=1;i<=m;i++)
     {
         cin>>edge[i].u>>edge[i].v>>edge[i].w;
    }
        bellman_ford(s);

     return 0;
 }