ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

LOJ10077

2019-03-15 21:53:49  阅读:162  来源: 互联网

标签:int LOJ10077 样例 cs 顶点 短路 dis


题目描述
给出一个 N 个顶点 M 条边的无向无权图,顶点编号为 1∼N。问从顶点 1 开始,到其他每个点的最短路有几条。

输入格式
第一行包含 2 个正整数 N,M,为图的顶点数与边数。

接下来 M行,每行两个正整数 x,y,表示有一条顶点 x 连向顶点 y 的边,请注意可能有自环与重边。

输出格式
输出 N 行,每行一个非负整数,第 i 行输出从顶点 1 到顶点 i 有多少条不同的最短路,由于答案有可能会很大,你只需要输出 mod100003 后的结果即可。如果无法到达顶点 i则输出 0。

样例
样例输入
5 7
1 2
1 3
2 4
3 4
2 3
4 5
4 5
样例输出
1
1
1
2
4
样例解释
1 到 5 的最短路有 4 条,分别为 2 条 1→2→4→5 和 2 条 1→3→4→5(由于 4→5 的边有 2 条)。

数据范围与提示
对于 20% 的数据,N≤100;

对于 60% 的数据,N≤1000;

对于 100% 的数据,1≤N≤100000,0≤M≤200000。

-------------------------------------------------------------------------------------------------------------------------

dij求最短路,增加数组cs[ ],用于统计对应点的最短路径条数。

如果刚计算出最短路,则 cs[v]=cs[u]。

如果最短路已经计算出切新计算的最短路与之相同,那么 cs[v]+=cs[u];

注意记得取模。

-------------------------------------------------------------------------------------------------------------------------

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int maxn=1e5+10;
 5 const int maxm=2e5+10;
 6 int n,m;
 7 struct edge
 8 {
 9     int u,v,w,nxt;
10 }e[maxm<<1];
11 int head[maxn],js;
12 void addage(int u,int v)
13 {
14     e[++js].u=u;e[js].v=v;e[js].w=1;
15     e[js].nxt=head[u];head[u]=js;
16 }
17 ll dis[maxn],cs[maxn];
18 bool vis[maxn];
19 struct node
20 {
21     int p,dis;
22     bool operator < (node b)const
23     {
24         return dis>b.dis;
25     }
26 };
27 void dij(int x)
28 {
29     memset(dis,0x3f,sizeof dis);
30     memset(cs,0,sizeof cs);
31     dis[x]=0;cs[x]=1;
32     priority_queue<node>q;
33     q.push((node){x,0});
34     while(!q.empty())
35     {
36         node t=q.top();
37         q.pop();
38         int u=t.p,d=t.dis;
39         if(vis[u])continue;
40         vis[u]=1;
41         for(int i=head[u];i;i=e[i].nxt)
42         {
43             int v=e[i].v;
44             if(dis[v]>dis[u]+e[i].w)
45             {
46                 dis[v]=dis[u]+e[i].w;
47                 cs[v]=cs[u];
48                 q.push((node){v,dis[v]});
49             }
50             else if(dis[v]==dis[u]+e[i].w) cs[v]=(cs[v]+cs[u])%100003;
51         }
52     }
53 }
54 int main()
55 {
56     scanf("%d%d",&n,&m);
57     for(int u,v,i=0;i<m;++i)
58     {
59         scanf("%d%d",&u,&v);
60         addage(u,v);addage(v,u);
61     }
62     dij(1);
63     for(int i=1;i<=n;++i)printf("%lld\n",cs[i]);
64     return 0;
65 }
View Code

 

标签:int,LOJ10077,样例,cs,顶点,短路,dis
来源: https://www.cnblogs.com/gryzy/p/10539689.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有