https://blog.csdn.net/yion_l/article/details/7748604
给出一个无权无向图,找出各点到起点1的最短路径距离。
思路:
1.先把边存起来,
2.从1开始广搜,利用队列,将与1相连的顶点且未被访问过的顶点存入队列中,并更新该顶点已经被访问过(保证距离最短),同时,算出此时该顶点到1的距离
3.重复步骤2,求出该顶点到上一个顶点的距离。
最终即可得到最终最短距离。
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
int m, n;
int a[1000][1000];
int visit[1000];
int longth[1000];
void bfs()
{
queue <int> q1;
q1.push(1);
visit[1]=1;
while(!q1.empty())
{
int temp=q1.front();//queue中的pop为front,没有pop
q1.pop();
longth[1]=0;
for(int i=1;i<=m;i++)
{
if(a[temp][i]&&!visit[i])
{q1.push(i);
visit[i]=1;//以上实现BFS 广义搜索
longth[i]=longth[temp]+1;}//在此基础上增加 当前节点的路径为上一个节点加1;因为有visit[]的保证下,
//节点必须是最先访问的,那么保证了该路径最短
}
}
}
int main()
{
cin>>m>>n;
memset(a,0,sizeof(a));
memset(visit,0,sizeof(visit));
memset(longth,-1,sizeof(longth));//-1表示未联通
for(int i=0;i<n;i++)
{
int xx,yy;
cin>>xx>>yy;
a[xx][yy]=a[yy][xx]=1;
}
bfs();
for(int i=1;i<=m;i++)
{
cout<<longth[i]<<' ';
}
cout<<endl;
}
延申:https://blog.csdn.net/qq_35710556/article/details/79583229
其他方法求解最短路径