您的位置:首页 > 编程语言 > C语言/C++

Bellman算法优化使用邻接表C++实现

2015-04-14 12:33 393 查看
用临接表来存储图的时间空间复杂度是O(M),遍历每一条边的时间复杂度也是O(M),如果一个图是稀疏图的话,M要远小于N^2,因此稀疏图选用邻接表来存储比用邻接矩阵来存储好很多。

#include<iostream>
#include<queue>
using namespace std;
int main()
{
int points,edgs;
cin>>points>>edgs;
int point1[10],point2[10],quanzhi[10];
int first[6],next[8];//数组的大小要比实际的点数要大1
int infinity=99999999;
for (int i=1;i<=points;i++)
{
first[i]=-1;
}
int p1,p2,w;
for (i=1;i<=edgs;i++)
{
cin>>p1>>p2>>w;
point1[i]=p1;
point2[i]=p2;
quanzhi[i]=w;
next[i]=first[point1[i]];//first[]存储的是顶点的编号
first[point1[i]]=i;//next[]存储的是第i条边的下一条边的编号
}
int flag[10],dis[10];
for (i=1;i<=points;i++)
{
flag[i]=0;
dis[i]=infinity;
}
queue<int>si;//队列用来记录使源点到顶点距离变短的点
si.push(1);	//在一轮循环结束后使队顶出列换队列下一个点比较判断
flag[1]=1;
int k;
dis[1]=0;
while (!si.empty())
{
k=first[si.front()];//优化主要用了源点的邻接点松弛相关边而不用1条边2条边
//循环,减少比较次数
while (k!=-1)
{
if (dis[point2[k]]>dis[point1[k]]+quanzhi[k])
{
dis[point2[k]]=dis[point1[k]]+quanzhi[k];
if (flag[point2[k]]==0)
{
si.push(point2[k]);
flag[point2[k]]=1;
}
}
k=next[k];
}
flag[si.front()]=0;//一轮结束队顶出列
si.pop();
}
for (i=1;i<=points;i++)
{
cout<<dis[i]<<" ";
}
cout<<endl;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐