摘要:
与poj1860相似,我建议这两题好好研究,其中透露很多最短路的性质,不要看他人博客写的很简单,就是bellman-ford什么的,然后一想对就坐上去了,那就失去刷题的本意,刷题本意是更深层次的理解一个算法并且灵活应用,看过大多人都是用最长路的方式求解的,但是最长路能用的本质是因为此题可以用最短路来求解,只是多了一个负号,那么去掉负号最短路就变成最长路了,请不要只是停留在知晓有一种最长路求法这样的表面,应该更深入探讨其本质。(纯属个人意见,大牛指点)View Code 1 #include <stdio.h> 2 #include <string.h> 3 #inclu 阅读全文
摘要:
其实我一直存在疑惑是什么导致dijkstra不能处理负权图?今日偶见某大牛说一句“dijkstra选定一个节点后节点值不在改变”,方才大悟。本质上就是dijkstra选点方式导致的(即贪心),只针对目前的情况作出最好的判断1)在非负权图中这点是没有错的2)在负权图中就出错了,如0 2 42 0 -34 -3 0为什么呢?证明dijkstra可行的最重要定理:即当i被选中时,dist(i)=min{w(s->i)}定理证明:若不存在一个节点j可以松弛i,那么显然定理成立,否则必存在某一节点j,dist(i)>w(j,i)+dist(j),那么由于在非负权图中所以w(j,i)>0 阅读全文
摘要:
经典bellman-ford,目标是求解最长路,(a-c)*r前加负号则转化为求解最短路,更简单的是用求解最短路的方式求解最长路(这举可行是题目原因)#include <stdio.h>#include <string.h>#define MAXN 300#define INF -(1<<29)int n,m,s;double v;struct node{ double r,c;}map[MAXN][MAXN];double d[MAXN];void bellman(){ for(int i=1;i<=n;d[i++]=INF); d[s]=v; fo 阅读全文