洛谷 1144 最短路计数
题意给一个图,问从1节点出发到所有i节点的最短路有多少条,边权都为1。
维护一个ans,如果dis[v]>dis[u]+1,那么ans[v]=ans[u]并更新距离。如果dis[v]==dis[u]+1,那么ans[v]+=ans[u]。
#include <bits/stdc++.h> #define mem(x) memset(x,0,sizeof(x)) #define mem1(x) memset(x,-1,sizeof(x)) using namespace std; const int M = 1e6+7; const int inf = 2147483647; const int mod = 100003; int n,m; int cnt,head[M],flag[M]; struct edge { int v,next; }e[M<<2]; void init(){ cnt=0;mem1(head); } void add(int u,int v){ e[++cnt].v=v;e[cnt].next=head[u]; head[u]=cnt; } struct node { int index,dis,ans; bool operator < (const node &k)const{ return dis>k.dis; } }d[M]; priority_queue<node> q; void dijkstra(int s){ for(int i=1;i<=n;i++) d[i].dis=inf,d[i].index=i,flag[i]=0,d[i].ans=0; d[s].dis=0;d[s].ans=1;q.push(d[s]); while(!q.empty()){ int u=q.top().index; q.pop(); if(flag[u]) continue; flag[u]=1; for(int i=head[u];~i;i=e[i].next){ int v=e[i].v; if(d[v].dis>d[u].dis+1){ d[v].ans=d[u].ans; d[v].dis=d[u].dis+1; q.push(d[v]); } else if(d[v].dis==d[u].dis+1){ d[v].ans+=d[u].ans; d[v].ans%=mod; } } } for(int i=1;i<=n;i++) printf("%d\n",d[i].ans); } int main(){ init(); scanf("%d%d",&n,&m); for(int i=1;i<=m;i++){ int from,to; scanf("%d%d",&from,&to); if(from==to) continue; add(from,to);add(to,from); } dijkstra(1); return 0; }

浙公网安备 33010602011771号