最短路径--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;
}
查看25道真题和解析
