标签:cnt edgeCnt int 短路 计数 P1144 nowU nowV dis
注意点:
- 本题需要开双向边.
#include<cstdio> #include<iostream> #include<queue> #include<cstring> #define int long long using namespace std; const int MAXN=2e6,MAXM=4e6,INF=2e9,MOD=100003; struct Edge{ int from,to,w,nxt; }e[MAXM]; int head[MAXN],edgeCnt=1; void addEdge(int u,int v,int w){ e[++edgeCnt].from=u; e[edgeCnt].to=v; e[edgeCnt].w=w; e[edgeCnt].nxt=head[u]; head[u]=edgeCnt; } struct Node{ int v,dis; bool operator <(Node another)const{ return dis>another.dis; } }; int dis[MAXN],cnt[MAXN]; int s=1; void dijkstra(){ memset(dis,0x3f,sizeof(dis)); priority_queue<Node> q; q.push(Node{s,0}); dis[s]=0,cnt[s]=1; while(!q.empty()){ Node nowNode=q.top(); q.pop(); int nowU=nowNode.v; for(int i=head[nowU];i;i=e[i].nxt){ int nowV=e[i].to; if(dis[nowV]>dis[nowU]+e[i].w){ dis[nowV]=dis[nowU]+e[i].w; cnt[nowV]=cnt[nowU]; q.push(Node{nowV,dis[nowV]}); }else if(dis[nowV]==dis[nowU]+e[i].w){ cnt[nowV]+=cnt[nowU]; cnt[nowV]=cnt[nowV]%MOD; } } } } signed main(){ int n,m; scanf("%lld%lld",&n,&m); for(int i=1;i<=m;i++){ int x,y; scanf("%lld%lld",&x,&y); addEdge(x,y,1); addEdge(y,x,1); } dijkstra(); for(int i=1;i<=n;i++){ cnt[i]=cnt[i]%MOD; printf("%lld\n",cnt[i]); } return 0; }
标签:cnt,edgeCnt,int,短路,计数,P1144,nowU,nowV,dis 来源: https://www.cnblogs.com/zbsy-wwx/p/11797581.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。