最短路径-SPFA算法
之前比赛考题中遇到两次最短路径的题,发现其中有一道题就用到了SPFA算法,特来学习下;给出参考blog…
算法描述
从图中的某个顶点出发到达另外一个顶点的所经过的边的权重和最小的一条路径。
下面单纯为了了解下SPFA算法思路,出了个题了解下算法的每个步骤。输入输出说明
输入:
第一行包括两个数n和m,代表点数和边数;
接下来的m行,每行输入3个数,代表有向边的起点与终点和边权重
输出:
输出第一个点到其他点的最短距离,每行第一个数 i 表示到第 i 个点,第二个数表示最短距离。
测试样例
输入参考这个图吧,剽取最上面那个blog的…
输入:
6 8
1 3 10
1 5 30
1 6 100
2 3 5
3 4 50
4 6 10
5 4 20
5 6 60
输出:
1 0
3 10
4 50
5 30
6 60
【代码】
#include<iostream>
#include<cstring>
#include<queue>
#define clr(x) memset(x,0,sizeof(x))
#define maxn 1000+5
#define maxint 1000000
using namespace std;
int n,m; //点数,边数
int mp[maxn][maxn]; //邻接矩阵
void chushihua(){
cin>>n>>m;
clr(mp);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++) mp[i][j]=maxint;
for(int i=0;i<m;i++){
int v1,v2,k;
cin>>v1>>v2>>k;
mp[v1][v2]=k;
}
}
int dis[maxn],s[maxn];
int path[maxn]; //路径上第i个点的前驱path[i]
void solve(int v){
queue<int> q;
for(int i=1;i<=n;i++){
dis[i]=maxint;
s[i]=0;
path[i]=-1;
}
dis[v]=0;
q.push(v);
while(!q.empty()){
int v1=q.front();
q.pop();
s[v1]=0;
// cout<<"dis :"; for(int i=0;i<n;i++) cout<<dis[i]<<" "; cout<<endl;
// cout<<"path:"; for(int i=0;i<n;i++) cout<<path[i]<<" ";cout<<endl;
for(int i=1;i<=n;i++){
if( dis[i]>dis[v1]+mp[v1][i]){
dis[i]=dis[v1]+mp[v1][i];
path[i]=v1;
if(!s[i]){
q.push(i);
s[i]=1;
}
}
}
}
}
int main(){
chushihua();
solve(1);
for(int i=1;i<=n;i++)
if(dis[i]<maxint)cout<<i<<" "<<dis[i]<<endl;
cout<<endl;
return 0;
}
2021-05-31 更新,感谢观看-