最短路径--Bellman_ford
最短路径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; }