周中训练总结

最近看的是最短路问题,最短路有四种方法,不同的方法适应条件和效率也不一样。最简单的是floyed算法,三重循环遍历,要注意的是最外层表示的是中间节点。最常用的是Dijkstra,算法主要是思想是:

思想:
 
1.首先初始化一个点到其本身距离为0,到其它点距离为无穷,记录距离点为e[i][j],初始化所有点;
 
2.然后,接着初始化顶点到其它点的距离,记为dis[i],在正式表示顶点算法中dis[i]储存最小距离。初始化是到某一个点i的距离,初始化方式是dis[i]=e[1][i];
 
3.接着,标记元素,没访问过的记为Q集合,用visit[i]=0表示;访问过的记为P集合,用visit[i]=1表示;
 
4.预处理完毕,第一层循环,以i表示1...n-1,里面的一个循环是找到距离i最近的点,标记已经访问过;
 
5.里面的另一层循环是找到刚刚找到的距离第i个顶点距离最短的点,记为u;然后找u到v最短距离;
 
6.如果v点未被枚举且dis[v]>dis[u]+e[u][v],那么就更新dis[v]的值;
 
7.继续遍历,直到所有元素都被标记为visit[i]=1;
 

其中做到的最典型的的一个题是 https://blog.csdn.net/lanshan1111/article/details/82956405,要注意方西是双向联通的;

还有两个算法没有做到典型题,周末补一下;感觉图论这一部分就是知识点比较多联系性比较大,就像dfs,bfs几乎大多数题都要用到,尤其是深度优先搜索,非常常用的一个算法,每次做的题类型都不一样,但是思想都是差不多,参数不同,要设置函数适当的参数;还有就是有的题需要剪枝,例如一个比较简单的:https://blog.csdn.net/lanshan1111/article/details/82944514,还有的深搜要设置好参数,参数不同,做法也不一样,就像一个题:https://blog.csdn.net/lanshan1111/article/details/82942701

周末还要抽出一定时间看四个常用最短路算法,把例题看一下,关键是把算法思想彻底理解,再做几道搜索题目。

 

 

你可能感兴趣的:(程序人生)