评测记录,只得了60分,不知知道哪里错了......
#include <bits/stdc++.h>
using namespace std;
const int N=1000001;
bool P[N];
int n,m,dist[N],ans[N];
struct Edge{
int v,w;
};
vector<Edge> G[N];
priority_queue<Edge> Q;
bool operator<(Edge a,Edge b)
{
return a.w>b.w;
}
void dij(int a)
{
ans[1]=1;
memset(dist,0x3f,sizeof(dist));
Q.push((Edge){1,0});
dist[1]=0;
while(!Q.empty())
{
Edge x=Q.top();Q.pop();
if(P[x.v]==1) continue;
P[x.v]=1;
for(int i=0;i<G[x.v].size();i++)
{
if(dist[G[x.v][i].v]>dist[x.v]+G[x.v][i].w)
{
dist[G[x.v][i].v]=dist[x.v]+G[x.v][i].w;
ans[G[x.v][i].v]=ans[x.v];
Q.push((Edge){G[x.v][i].v,dist[G[x.v][i].v]});
}
else if(dist[G[x.v][i].v]==dist[x.v]+G[x.v][i].w)
{
ans[G[x.v][i].v]+=ans[x.v];
}
}
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int x,y;
cin>>x>>y;
G[x].push_back({y,1});
G[y].push_back({x,1});
}
dij(1);
for(int i=1;i<=n;i++)
cout<<ans[i]<<endl;
}