树与图的广度优先 AcWing 847. 图中点的层次
原题链接
算法标签
bfs
思路
见代码
代码
#include<bits/stdc++.h>
#define int long long
#define rep(i, a, b) for(int i=a;i<b;++i)
#define Rep(i, a, b) for(int i=a;i>b;--i)
using namespace std;
const int N = 100005, M = N * 2;
int d[N];
int h[N], e[M], ne[M], idx;
//存储层次遍历序列 0号节点是编号为1的节点
int q[N];
int n,m;
inline int rd(){
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}
void put(int x) {
if(x<0) putchar('-'),x=-x;
if(x>=10) put(x/10);
putchar(x%10^48);
}
void add(int a, int b){
e[idx]=b, ne[idx]=h[a], h[a]=idx++;
}
int bfs(){
int hh=0, tt=0;
//0号节点是编号为1的节点
q[0]=1;
memset(d, -1, sizeof d);
//存储每个节点离起点的距离
d[1]=0
;
// 当队列不为空时
while(hh<=tt){
// 取出队列头部节点
int t=q[hh++];
// 遍历t节点的每一个邻边
for(int i=h[t]; i!=-1; i=ne[i]){
int j=e[i];
//如果j没有被扩展过
if(d[j]==-1){
//d[j]存储j节点离起点的距离,并标记为访问过
d[j]=d[t]+1;
// 把j结点 压入队列
q[++tt]=j;
}
}
}
return d[n];
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
n=rd(), m=rd();
memset(h,-1,sizeof h);
rep(i, 0, m){
int a=rd(), b=rd();
add(a, b), add(b, a);
}
printf("%lld\n", bfs());
return 0;
}
bfs数组模拟模板
int bfs(){
int hh=0, tt=0;
//0号节点是编号为1的节点
q[0]=1;
memset(d, -1, sizeof d);
//存储每个节点离起点的距离
d[1]=0
;
// 当队列不为空时
while(hh<=tt){
// 取出队列头部节点
int t=q[hh++];
// 遍历t节点的每一个邻边
for(int i=h[t]; i!=-1; i=ne[i]){
int j=e[i];
//如果j没有被扩展过
if(d[j]==-1){
//d[j]存储j节点离起点的距离,并标记为访问过
d[j]=d[t]+1;
// 把j结点 压入队列
q[++tt]=j;
}
}
}
return d[n];
}
bfs队列模拟模板
int bfs()
{
memset(d, -1, sizeof d);
queue<int> q;
d[1] = 0;
q.push(1);
while (q.size())
{
int t = q.front();
q.pop();
for (int i = h[t]; i != -1; i = ne[i])
{
int j = e[i];
if (d[j] == -1)
{
d[j] = d[t] + 1;
q.push(j);
}
}
}
return d[n];
}
原创不易
转载请标明出处
如果对你有所帮助 别忘啦点赞支持哈