• 洛谷P1144 最短路计数 图论最短路 记忆化搜索


    洛谷P1144 最短路计数
    图论最短路 记忆化搜索

    题意 求 起点 到各个点的最短路 有几条

    注意 要 %
    最短路计数
    首先求一遍单源最短路 可以用 SPFA 或者 堆优化 + dijkstra
    然后就可以求 每个点 到 1 的最短距离
    然后 记忆化搜索下去 就可以求得 到这一个点的最短路有几条

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <cstdlib>
     4 #include <cmath>
     5 #include <string>
     6 #include <algorithm>
     7 #include <iomanip>
     8 #include <iostream>
     9 #include <queue>
    10 using namespace std ; 
    11 
    12 const int maxn = 1000011,maxe = 2000011,inf = 1e9 ; 
    13 struct node{
    14     int to,pre ; 
    15 };
    16 node e[2*maxe] ; 
    17 int n,m,cnt,u,v,x,y,ans ; 
    18 int dist[maxn],head[maxn],dp[maxn] ;
    19 bool vis[maxn],f[maxn] ; 
    20 queue <int> Q ;
    21 
    22 inline void adde(int x,int y) 
    23 {
    24     e[++cnt].to = y ; 
    25     e[cnt].pre = head[ x ] ; 
    26     head[ x ] = cnt ; 
    27 }
    28 
    29 inline void SPFA(int s,int t) 
    30 {
    31     for(int i=1;i<=n;i++) dist[ i ] = inf,vis[ i ] = 0 ; 
    32     Q.push(s) ; 
    33     vis[ s ] = 1 ;
    34     dist[ s ] = 0 ; 
    35     while(!Q.empty()) 
    36     {
    37         u = Q.front() ; 
    38         vis[ u ] = 0 ;
    39         Q.pop() ;
    40         for(int i=head[ u ];i;i = e[ i ].pre) 
    41         {
    42             v = e[ i ].to ; 
    43             if( dist[ u ] + 1 < dist[ v ] ) 
    44             {
    45                 dist[ v ] = dist[ u ]+1 ;
    46                 if(!vis[ v ]) 
    47                 {
    48                     vis[ v ] = 1; 
    49                     Q.push(v) ;  
    50                 }
    51             }
    52         }
    53     } 
    54 }
    55 
    56 int dfs(int u)    //   记忆化搜索     
    57 {
    58     int v ; 
    59     if(dp[ u ]) return dp[ u ] ;       // 
    60     for(int i=head[ u ];i;i=e[i].pre) 
    61     {
    62         v = e[ i ].to ;
    63         if(dist[v]+1==dist[ u ]) dp[ u ] = (dp[ u ]+dfs(v)) % 100003 ; 
    64     }
    65     return dp[ u ] ; 
    66 }
    67 
    68 int main() 
    69 {
    70     scanf("%d%d",&n,&m) ; 
    71     for(int i=1;i<=m;i++) 
    72     {
    73         scanf("%d%d",&x,&y) ; 
    74         adde(x,y) ;  
    75         adde(y,x) ; 
    76     }
    77     SPFA(1,n) ;  
    78     dp[ 1 ] = 1 ;
    79     
    80     for(int i=1;i<=n;i++) 
    81         printf("%d
    ",dfs( i ) ) ; 
    82       return 0 ; 
    83 }
  • 相关阅读:
    Vue基本指令
    C primer plus 6 编程练习答案
    Archlinux安装总结
    xcfe桌面快捷键整理
    openSUSE XFCE桌面 多媒体解码器安装
    Arch i3wm
    arch xfce快捷键
    Archlinux配置~小米笔记本Air 13.3英寸版本
    Archlinux安装指南~小米笔记本Air 13.3英寸版本
    Linux~Archer 进化之路
  • 原文地址:https://www.cnblogs.com/third2333/p/6928359.html
Copyright © 2020-2023  润新知