单元最短路(Single-Soure Shortest Paths)SSSP
无权图,路径是1;
采用深度优先搜索,定义dist数字存储路径长度,,之后进行深度优先搜索。
利用dist存储路径长度还有一个好处就是不用建立visited数组进行存储是否遍历过。dist数组初始化-1;
伪码描述:
void Unweight(int S)
{
{
建立队列,S入队;
只要队列不空,所有和S相连的W,只要W的dist是-1(代表没有被访问过),dist[W]=dist[S]+1;
}
具体代码:
void Unweight(int S)
{
int W;
queue<int>Q;
Q.push(S);
while(!Q.empty())
{
W=Q.front();
Q.pop();
for(int i=0;i<MAX;i++)
{
if(G[i][W]||G[W][i])
{
if(dist[i]==-1)
{
dist[i]=dist[W]+1;
Q.push(i);
}
}
}
}
}
2.有权图的最短路问题:
Dijkstra算法:
Diljstra算法适用于边权为正的情况,原理描述:
令S={源点s+已经确定了最短路径的顶点vi}
对任一未收录的顶点v定义dist[v],定义dist[v]为s到v的最短路径长度,但该路径仅仅经过S中的顶点。即路径{s->(vi属于S)->v
的最小长度。
经过多次迭代,S中的元素将收录所有元素。
每次从未收录的顶点中选一个dist最小的收录(贪心)
增加一个v进入S,可能影响另一个w的dist值,dist[w]=min(dist[w],dist[v]+<v,w>权重}
这个需要初始化,将源点初始化为0,其余相邻初始化为权重。
具体:伪代码描述:
清除所有点的标号
设d[0]=0,其他d[i]=INF,循环n次
{
在所有未标记的点中,选出d值最小的结点x,给x标记,对于从x出发的所有边(x,y),更新d[y]=min(d[y],d[x]+G[x][y])
}
void Dijkstra(int S)
{
memset(visied,false,sizeof(visited));
for(int i=0;i<n;i++) dist[i]=(i==S?0:INF);
for(int i=0;i<n;i++)
{
int x,m=INF;
for(int y=0;y<n;y++) if(!visited[y]&&d[y]<=m) m=dist[x=y];
v[x]=true;
for(int y=0;y<n;y++) d[y]=min(d[y],d[x]+G[x][y]);
}
}