【最短路】题型小总结

最短路算法大家都很清楚了,比较常用的有dijkstra、SPFA、floyd

板题

有N个点,M条边,求S到T的最短路

直接套dijkstra板

最短路计数

统计最短路条数

加一个way[]数组统计,每次更新dist时,way[to]=way[u]
当dist相等时way[to]+=way[u]

打印最短路

借助一个pre[]数组,与计数处理方式类似

双权最短路

先以优先权值求出最短路的所有路径,再从路径中查找出第二权值最小的路径

权值相乘的最短路

那就把权值相加改为相乘

求路径上最大值最小的路径

将松弛操作改为取最小值操作
dist[to]=min(dist[to],max(dist[u],edge[k].w));

带负权最短路

套SPFA板

第K短路

启发式搜索【A*】

往返最短路

正反图都跑一次最短路

破坏路径最短路

随机破坏一条路径,求最坏情况下的最短路

如果有影响破坏的路径一定在原先最短路上,先求出路径,再对每一条边分别拆掉跑一次最短路

封锁海域问题

有N个点依次排布在一个平面上,平面有左边界和右边界,求最少给每个点多大的范围,才能使这些点将平面分隔开

主要是构图:
对于每两个点之间连一条边,权值为两点距离和一半,然后左右边界分别向每个点连一条边,权值为点到边界距离
然后跑一次从左边界到右边界的最大权值最小的最短路就好了√

物品合成问题

有N种物品各有价值,其中某些可以两两合成另一个物品,求合成某个物品所需最小价值

看似和最短路没有联系,实际上有着最短路的思想:
先令dist[i]为第i个物品的价值
每次取出价值最小且未访问过的物品,尝试用它和其他物品组合来减小其他物品的dist
最终每个物品的dist就是最小价值

差分约束系统

这玩意要单独拿出来讲。。。。先不写先。

最小密度路径

求出任意两点间  路径权值和/路径数   最小的路径

floyd算法
令dist[i][j][L]表示从i->j经过L条路径的最短路
然后四重循环:
for(L 2->N)
	for(k 1->N)
		for(i 1->N)
			for(j 1->N)
				if(i!=j&&j!=k&&i!=k&&dist[i][j][L]>dist[i][k][L-1]+dist[k][j][L-1])
					dist[i][j][L]=dist[i][k][L-1]+dist[k][j][L-1];




posted @ 2017-09-12 18:07  Mychael  阅读(322)  评论(0编辑  收藏  举报