ps:本来是复习图论的,最后变成了预习,隔了一段时间简直了,重新学过!
哈哈哈哈哈哈哈,,真的菜啊!
单源最短路问题是求,,固定一个起点,求它到其他所有点的最短路问题。
两点之间最短路是求,固定起点和终点求最短路
两者没有根本区别,复杂度也是一样的
1,单源最短路1 bellman-ford算法
核心算法:
d[i]=min(d[j]+(从顶点j到顶点i边的权值),d[i])
d【i】表示任意点到顶点i的最短距离
一般初始化为INF,,然后起点d【s】初始化0。
只要图中不存在负圈(负圈是指两点间权值为负数所形成的圈)更新操作就是有限的
struct edge// 从顶点from——>to的权值为cost的边 { int from; int to; int cost; }; edge es[maxn]; //边 int d[maxn]; //最短距离 int v,b; //分别为顶点和边数 void bellman(int s)//从顶点开始递归 { for(int i=0;i<v;i++) d[i]=INF;//先把所有顶点的最短距离设为最大,排除自圈 d[s]=0;//初始化起点 while(true) { bool vis=false; for(int i=0;i<b;i++) { edge e=es[i]; if(d[e.from]!=INF&&d[e.to]>d[e.from]+e.cost) { d[e.to]=d[e.from]+e.cost; update=true; } } if(!update)break; } }
算了找到了大佬的详细思路,我看懂了再来补把
bellman-ford算法:http://www.wutianqi.com/?p=1912
dijkstra算法:http://www.wutianqi.com/?p=1890
floyd算法:http://www.wutianqi.com/?p=1903