Bellman-ford队列优化算法 SPFA算法
2016-03-11 16:23
274 查看
Bellman-ford队列优化算法的核心在于
:继承了bellman-ford算法的核心内容(邻接表处理)
利用队列优化,减少了不必要的判断
下面在代码中进行详解
#include"iostream"
#include"cstdio"
#define inf 9999999
using namespace std;
int u[100]; //u,v,w为邻接表存储边信息的必要数组空间
int v[100];
int w[100];
int dis[100]; //记录源点到其余个点的最短路
int first[100]; //记录i为起点的第一个边的编号
int next[100]; //记录i号边的下一条边的编号
int n,m;
int book[100]; //判重是否点已经进入队列
int queue[100]; //队列
int head;
int tail;
int k;
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++) //dis初始化
{
dis[i]=inf;
}
dis[1]=0;
for(int i=1;i<=n;i++) //first初始化
{
first[i]=-1;
}
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&u[i],&v[i],&w[i]); //边的录入
next[i]=first[u[i]];
first[u[i]]=i;
}
queue[1]=1;
head=1;
tail=2;
book[1]=1;
while(head<tail)
{
k=first[queue[head]];
while(k!=-1)
{
if(dis[v[k]]>dis[u[k]]+w[k])
{
dis[v[k]]=dis[u[k]]+w[k];
if(book[v[k]]==0)
{
book[v[k]]=1;
queue[tail]=v[k];
tail++;
}
}
k=next[k];
}
head++;
book[queue[head]]=0;
}
for(int i=1;i<=n;i++)
{
printf("%d ",dis[i]);
}
return 0;
}
:继承了bellman-ford算法的核心内容(邻接表处理)
利用队列优化,减少了不必要的判断
下面在代码中进行详解
#include"iostream"
#include"cstdio"
#define inf 9999999
using namespace std;
int u[100]; //u,v,w为邻接表存储边信息的必要数组空间
int v[100];
int w[100];
int dis[100]; //记录源点到其余个点的最短路
int first[100]; //记录i为起点的第一个边的编号
int next[100]; //记录i号边的下一条边的编号
int n,m;
int book[100]; //判重是否点已经进入队列
int queue[100]; //队列
int head;
int tail;
int k;
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++) //dis初始化
{
dis[i]=inf;
}
dis[1]=0;
for(int i=1;i<=n;i++) //first初始化
{
first[i]=-1;
}
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&u[i],&v[i],&w[i]); //边的录入
next[i]=first[u[i]];
first[u[i]]=i;
}
queue[1]=1;
head=1;
tail=2;
book[1]=1;
while(head<tail)
{
k=first[queue[head]];
while(k!=-1)
{
if(dis[v[k]]>dis[u[k]]+w[k])
{
dis[v[k]]=dis[u[k]]+w[k];
if(book[v[k]]==0)
{
book[v[k]]=1;
queue[tail]=v[k];
tail++;
}
}
k=next[k];
}
head++;
book[queue[head]]=0;
}
for(int i=1;i<=n;i++)
{
printf("%d ",dis[i]);
}
return 0;
}
相关文章推荐
- Android 判断网络类型 wifi,2G,3G,4G
- 标识符和关键字
- ListView中的item中的Onclick事件的优化
- 强悍的 Linux —— 强悍的 ls
- RPC中Hessian请求转发
- 整数划分
- 知识积累:.length和.length()
- vc连接access数据库及数据表基本操作
- java.lang.IllegalStateException异常产生的原因及解决办法
- 链表C++实现
- Core Animation - 视觉效果<三>
- 整数划分
- java实时监听日志写入kafka(转)
- 保存网址
- js常用模板引擎
- 事务和锁
- 1/7 = 0.142857142... 是个无限循环小数。 任何有理数都可以表示为无限循环小数的形式。 本题目要求即是:给出一个数字的循环小数表示法。 例如: 输入: 1,5 则输出: 0.2 输入
- 一个反射的例子
- 程序员如何写出牛掰的简历
- iOS开发系列--通知与消息机制