供自己复习用
1、Floyd-Warshall算法
适用于多源最短路径,稠密图,和顶点关系密切,时间复杂度O(n^3)
思想是动态规划
核心代码:
for(int k=0;k<n;k++)
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(e[i][k]<INF&&e[j][k]<INF&&e[i][j]>e[i][k]+e[k][j])
e[i][j]=e[i][k]+e[k][j];
思想是从两个点构成的路开始,不断往里面加点,首先确定增加1个点时的最短路径,再确定增加2个、3个...n个的情况。三重for循环其实是n个二重for循环的叠加,从代码上也可以直观地看出这种想法
2、Dijstra算法(重点)
单源最短路径,稠密图,和顶点关系密切,时间复杂度O((M+N)logN)
思想是贪心算法
核心代码:
/*pseudocode*/
void Dikjstra(){
int v,w;//vertices
int known[MaxVertexNum];
int dist[MaxVertexNum];
for(;;){
v=smallest unknown distance vertex;
if(v==NotAVertex)//defined to be -1
break;
known[v]=true;//means v is visited
for(each w adjacent to v)
if(!known[w])
if(dist[v]+Cwv<dist[w])
dist[w]=dist[v]+Cwv;//update the shortest path
path[w]=v;//record the path
}
}
贴几道PTA的题:
4-11 Shortest Path [1] (25分)
Write a program to find the unweighted shortest distances from any vertex to a given source vertex in a digraph.
Format of functions:
void ShortestDist( LGraph Graph, int dist[], Vertex S );
where LGraph
is defined as the following: