Catalog
  1. 1. 虽然题目叫最短路计数,但是TA可以只用到最短路的概念而不用最短路的算法……
  2. 2. 具体思路
  3. 3. 代码
最短路计数-题解

查看原题请戳这里

虽然题目叫最短路计数,但是TA可以只用到最短路的概念而不用最短路的算法……

由于这是一个无权图,所以一条路径上边的数量就是这条路径的长度,那么我们就可以用BFS来搞定这个问题了。

具体思路

我们每遍历到一个节点就和ta的前一个结点的距离比较,这里会有三种情况:(由1到2)

  1. 2号点没有被访问过||time[1] + 1 < time[2]:此时我们直接用1号点的信息去更新2就好啦
  2. time[1] + 1 = time[2] : 这个我们就只需要更新一下ans就可以啦
  3. time[1] + 1 > time[2] :此时这条路径比之前的某条路径要长,直接跳过就可以啦

    代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<cmath>
    #include<algorithm>
    #include<queue>
    #define ll long long
    #define INF 0x7fffffff
    #define re register

    using namespace std;

    int read()
    {
    register int x = 0,f = 1;register char ch;
    ch = getchar();
    while(ch > '9' || ch < '0'){if(ch == '-') f = -f;ch = getchar();}
    while(ch <= '9' && ch >= '0'){x = x * 10 + ch - 48;ch = getchar();}
    return x * f;
    }

    queue<int> que;

    struct edge{
    int next,to,v;
    }e[2000005];

    int n,m,cnt,x,now,y,tim[2000000],ans[2000000],d[2000000];

    inline int add(int x,int y)
    {
    e[++cnt].to = y;
    e[cnt].next = d[x];
    d[x] = cnt;
    }

    int main()
    {
    n = read();
    m = read();
    for(re int i = 1; i <= m; i++)
    {
    x = read(); y = read();
    add(x,y); add(y,x);

    }
    que.push(1);
    ans[1] = 1;
    while(!que.empty())
    {
    now = que.front();
    que.pop();
    for(re int i = d[now]; i; i = e[i].next)
    {
    if(tim[now] + 1 < tim[e[i].to] || tim[e[i].to] == 0)
    {
    tim[e[i].to] = tim[now] + 1;
    ans[e[i].to] = ans[now];
    que.push(e[i].to);
    }
    else
    if(tim[now] + 1 == tim[e[i].to]) ans[e[i].to] = (ans[e[i].to] + ans[now]) % 100003;
    }
    }
    ans[1] = 1;
    for(re int i = 1; i <= n; i++) printf("%d\n",ans[i]);
    return 0;
    }
Author: wflight
Link: http://yoursite.com/2019/08/02/最短路计数-题解/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Donate
  • 微信
  • 支付寶

Comment