仅谈谈个人对dijkstra的理解,dijkstra算法是基于邻接表实现的,用于处理单源最短路径问题(顺便再提一下,处理单源最短路径问题的还有bellman算法)。开辟一个结构体,其变量为边的终点和边权,这时候还需要一个这个结构体类型的数组,数组的下标则为边的始点,我们都知道在图中,一个始点连出去的可能不止一条边,这样的话就类似用到一个二维数组了,我们在arr[][]的第一维存放的是边的始点,第二维则是这个始点对应的不同终点及其权值,学过邻接表的人应该就能看出来这就是一个邻接表了呗!

而对于邻接表的实现这里我选择的是用使一个vector容器,vector的一大好处在于对于数组的空间大小分配它可以自动合理处理(此处仅为个人理解,想要清楚具体了解vector请见书或者百度),说到这儿我的各条边算是在邻接表中存好了,那具体要如何实现最短路径,我还需要一个堆,一个小顶堆,对于源点s,它的dis[s]=0(dis[]数组存储的是源点到该点的最短距离)这个时候我们将dis[s]和它对应的终点(这个时候依旧是s)存入堆当中,然后从堆中提出dis【】最小的点,利用邻接表找到它的每一个相邻的点,也就是以它为起点的每一个终点,如果终点的dis已经小于起点了,那就继续,否则判断,如果终点的dis大于起点的dis加上这条边对应的边权的和,那么改变终点的dis,并把其存入堆中。。。可能有点混乱,那就看代码吧:

#include<iostream>
#include<vector>
#include<queue>
#define INF 10000000
using namespace std;

struct eg
{
int t;
int c;
eg(int t1,int c1) //一个构造函数
{
t=t1;
c=c1;
}
};
typedef pair<int,int>p;
vector<eg>G[100];
int dis[100];//用于存储源点到该点的最短距离
priority_queue< p,vector<p>,greater<p> > que;//加上vector<p>,greater<p>后实现的则是一个小顶堆,不然实现的是一个大顶堆

void dijkstra(int s)
{
fill(dis,dis+100,INF);//先对每一个点的dis赋初值为一个极大数
dis[s]=0;//源点到源点

que.push(p(0,s));

while(!que.empty())
{
p p1=que.top();
que.pop();
if(dis[p1.second]<p1.first) continue;
int size=G[p1.second].size();
for(int j=0;j<size;j++)
{
eg e=G[p1.second][j];
if(dis[e.t]>p1.first+e.c)
{
dis[e.t]=p1.first+e.c;
que.push(p(p1.first+e.c,e.t));//需要注意的是存入堆中的到底是什么
}
}
}
}

void solve()
{
int V,E;
cin >> V >> E;
for(int i=0;i<E;i++)
{
int s1,t1,c1;
cin >>s1 >> t1 >> c1;
G[s1].push_back(eg(t1,c1));//按源点s1存储
}
int s;
cin >> s;
dijkstra(s);
int t;
cin>> t;
cout << dis[t] << endl;
}

int main()
{
solve();
return 0;
}

最新文章

  1. [ZigBee] 14、Zigbee无线通信前奏——BasicRF 简单无线点对点传输协议
  2. Bootstrap入门(二)栅格
  3. “面向对象&quot;和&quot;面向过程&quot;到底有什么区别?
  4. 使用jQuery解析xml时command节点解析失败
  5. thinkphp中的HTTP类实现下载
  6. 将NavigationBar设置透明
  7. eclipse 批量 查询 替换
  8. python基础学习05(核心编程第二版)部分
  9. jdbc操作步骤和preparedStatment相比Statment的好处
  10. Hbulider里面template模板自用
  11. Ecstore1.2启用mongodb添加索引
  12. js两个判断&amp;&amp;的值与||的值
  13. Predix Asset Service深度分析
  14. 结对作业--基于GUI的四则运算生成器
  15. 关于Android 7.0(API24)相机的问题汇总
  16. UiPath实践经验总结(一)
  17. HDU1754-ZKW线段树
  18. Web端常见问题总结
  19. C#_计算目前时间到指定的周X、指定的时间X 还有多少秒
  20. mysql5.5.28在Linux下的安装

热门文章

  1. Spring 框架下Controller 返回结果在EasyUI显示
  2. android DevicePolicyManager实现一键锁屏
  3. TCP/IP协议学习(三) STM32中ETH驱动配置注意事项
  4. 爬虫:获取多次跳转后的页面url
  5. 解决WCF的service端无法使用泛型的问题
  6. laravel 中 与前端的一些事2 之使用Gulp编译sass
  7. MySQL 循环执行kill语句杀掉连接
  8. Sqlserver2012 中文乱码解决
  9. JDE Client开发端 左侧边栏设置
  10. 请尝试使用 Console.Read。错误原因