下面是代码XD
#include <bits/stdc++.h>
using namespace std;
const int N=1e6+5;
const int M=4e6+5;
int head[N];//head指向当前一个点的最后一个出边在e数组中的下标
struct edge{
int u;//起始点
int v;//终点
int ne;//指向点u的上一条出边
};
int idx;
edge e[M];
void add(int a,int b)
{
e[++idx].u=a;
e[idx].v=b;
e[idx].ne=head[e[idx].u];
head[e[idx].u]=idx;
}
int line[M];//line[i]存储的是顶点1到i的路径数
int dis[M];//dis[i]储存的是顶点1到i的最短路径长度
queue <int> q;
void bfs()
{
while(!q.empty())
{
int x=q.front();
q.pop();
int i=head[x];
while(i)
{
int t=e[i].v;
if(dis[t]<dis[x]+1)
{
dis[t]=dis[x]+1;
q.push(t);
}
if(dis[x]+1==dis[t]) line[t]+=line[x];
i=e[i].ne;
}
}
}
int main()
{
int n,m;
cin>>n>>m;
for(int i=0;i<m;i++)
{
int u,v;
cin>>u>>v;
add(u,v);
add(v,u);
}
memset(dis,0x3f3f3f3f,sizeof(dis));
memset(head,0,sizeof(head));
memset(line,0,sizeof(line));
dis[1]=0; line[1]=1;
q.push(1);
bfs();
for(int i=0;i<n;i++)
{
cout<<line[i]<<endl;
}
return 0;
}