P1144 最短路计数

Problem
Code:

#include
using namespace std;
typedef long long ll;
const int N=1e6+7;
const int mod=1e5+3;
int n,m;
int d[N],cnt[N];
vector<int>e[N];
void dijkstra(){
	memset(d,0x3f,sizeof(d));
	priority_queue<pair<int,int> >q;
	q.push(make_pair(~d[1],1));
	d[1]=0,cnt[1]=1;
	while(!q.empty()){
		int u=q.top().second;q.pop();
		for(int i=0;i<e[u].size();++i){
			int v=e[u][i];
			if(d[v]>d[u]+1)d[v]=d[u]+1,cnt[v]=cnt[u],q.push(make_pair(~d[v],v));
			else if(d[v]==d[u]+1)cnt[v]=(cnt[v]+cnt[u])%mod;
		}
	}
}
int main(){
	cin>>n>>m;
	while(m--){
		int u,v;cin>>u>>v;
		e[u].push_back(v);
		e[v].push_back(u);
	}
	dijkstra();
	for(int i=1;i<=n;++i)cout<<cnt[i]<<endl;
	return 0;
}

你可能感兴趣的:(luogu)