洛谷
靠,不太会。
水了一手他人题解,
有时间再补
下次一定
//dijkstra
#include<cstdio>
#include<iostream>
#include<vector>
#include <queue>
#include<cstring>
using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = 1e6 + 15;
const int Mod = 1e5+3;
typedef pair<int ,int > pa;
int n,m,ok=1;
long long ans = 0;
struct edge
{
int to,cost;
};
int d[maxn],d2[maxn],f[maxn];
vector<edge>G[maxn];
void dijkstra(int s)
{
priority_queue<pa ,vector<pa>, greater<pa > > q;
memset(d,inf,sizeof(d));
d[s]=0;
f[1] = 1;
q.push( pa(0,s) );
while( !q.empty() )
{
pa temp =q.top();
q.pop();
int v=temp.second;
if( temp.first > d[v] ) continue;
for( int i=0;i < G[v].size(); i++ )
{
edge e=G[v][i];
if(d[e.to] == d[v] + e.cost ) f[e.to] =( f[e.to] + f[v] )%Mod ;
if(d[e.to] > d[v] + e.cost ) {
f[e.to] = f[v];
d[e.to]=d[v]+e.cost;
q.push(pa(d[e.to],e.to));
}
}
}
}
int main()
{
scanf("%d%d",&n,&m);
// cin>>n>>m;
for(int i=1;i<=m;i++)
{
int s,t,v;
scanf("%d%d",&s,&t);
//cin>>s>>t;
if( s==t && s==1) f[s]++;
if( s!=t ){
G[s].push_back( {t,1} );
G[t].push_back({s,1});
}
}
dijkstra(ok);
for(int i=1;i<=n;i++)
{
//cout<<d[i]<<" ";
cout<<f[i]%Mod<<endl;
}
return 0;
}