更加深入的了解SPFA
SPFA算法是求单源路径的经典算法,就是一点到其它所有点的最短路径。
这个类似于Flyod但是效率要高很多。下面给出具体的演示。
Sample Input
5 5
1 2 7
1 3 3
3 4 3
2 5 3
4 5 3
#include "iostream"
#include "cstring"
#include "queue"
using namespace std;
#define INF 999999999
#define eMax 505
#define nMax 105
bool vis[nMax];
int dis[2][nMax], num, rec[nMax], n, m;
struct Node
{
int u, v, w, pre;
}e[eMax*2];
void Init(int u, int v, int w)
{
e[num].u = u;
e[num].v = v;
e[num].w = w;
e[num].pre = rec[u];
rec[u] = num++;
}
void spfa(int s, int p)
{
memset(vis, false, sizeof(vis));
dis[p][s] = 0;
queue<int> q;
q.push(s);
while(!q.empty())
{
s = q.front();
q.pop();
vis[s] = false;
int j, v;
for(j=rec[s]; j!=-1; j=e[j].pre)
{
v = e[j].v;
if(dis[p][s] + e[j].w < dis[p][v])
{
dis[p][v]=dis[p][s]+e[j].w;
if(!vis[v])
{
vis[v] = true;
q.push(v);
}
}
}
}
}
int main()
{
int u, v, w;
while(cin>>n>>m)
{
num = 0;
memset(rec, -1, sizeof(rec));
memset(dis, 0x3f, sizeof(dis));
int ans = INF;
while(m--)
{
cin>>u>>v>>w;
Init(u, v, w);
Init(v, u, w);
}
spfa(1, 0);
spfa(n, 1);
for(int i=0; i<num; i++)
if(dis[0][e[i].u]+dis[1][e[i].v] < ans)
ans = dis[0][e[i].u]+dis[1][e[i].v];
if(ans < INF) cout<<ans<<endl;
else cout<<"-1"<<endl;
}
}
在上面的代码中我们用了一个二维的数组来分别保留
1到其它所有点的最短距离和n到其它所有点的最短距离。
就是这样,这个就是SPFA。
posted on 2011-11-26 10:38 More study needed. 阅读(366) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架