无权边单源最短路径相对来说比较简单,边数就是路径长度。从出发点开始,先收集路径为0顶点(它本身),然后收录他的邻顶点(路径为1),再依次收录长度为2,3,4....。整个过程其实就是一个广度优先搜索(BFS),但是需要做些改变,需要一个数组d[w]来记录顶点w到源点s的路径长度,开始时要将d[w]初始化为-1,由于d[s]表示s到s的距离,d[s]=0,d[w]还有一个作用就是判断顶点w是否被收集过。用path[w]来记录w的前一个结点是什么,这样方便打印出路径。
void Unweight(Grape G, int i){
Q.push(i); //顶点入队
Enode*edge = NULL;
while (!Q.empty()){
i=Q.front(); //取出队头顶点并出队
Q.pop();
for (edge = G.Adjlist[i].Firstedge; edge; edge = edge->next){
if (d[edge->advj] == -1){ /*若没有收录过*/
d[edge->advj] = d[i] + 1; /*路径加1*/
path[edge->advj] = i; /*记录他前面一个顶点*/
Q.push(edge->advj); //入队
}
}
}
}
void PrintPath(int s,int j){ //打印源点s到j的路径
if (j == s){
cout << s;
return;
}
PrintPath(s,path[j]);
cout <<"->"<<j;
}