• hdu1142(最短路+记忆化搜索)


    http://acm.hdu.edu.cn/showproblem.php?pid=1142

    题目意思挺模糊

    大致思路,以终点为源点,做一次单源最短路

    深搜一遍图(下一步到达的位置  比现在位置  离终点更近)

    记录每个节点上可行数

     1 #include <bits/stdc++.h>
     2 
     3 struct Edge
     4 {
     5     int v, w;
     6     Edge(int _v, int _w): v(_v), w(_w){}
     7 };
     8 
     9 const int MAXN = 1000 + 10;
    10 
    11 std::vector<Edge> E[MAXN];
    12 
    13 int n, m, dp[MAXN];
    14 
    15 bool vis[MAXN];
    16 int dist[MAXN];
    17 
    18 void init()
    19 {
    20     memset(vis, false, sizeof(vis));
    21     memset(dp, 0, sizeof(dp));
    22     for(int i = 1; i <= n; ++ i){
    23         dist[i] = 1<<30;
    24         E[i].clear();
    25     }
    26 }
    27 
    28 void addEdge(int a, int b, int d)
    29 {
    30     E[a].push_back(Edge(b, d));
    31     E[b].push_back(Edge(a, d));
    32 }
    33 
    34 void spfa(int start)
    35 {
    36     vis[start] = true;
    37     dist[start] = 0;
    38     std::queue<int> que;
    39     que.push(start);
    40     while(que.empty()==false){
    41         int u = que.front();
    42         que.pop();
    43         vis[u] = false;
    44         for(int i = 0; i < E[u].size(); ++ i){
    45             int v = E[u][i].v;
    46             int w = E[u][i].w;
    47             if(dist[v] > dist[u] + w){
    48                 dist[v] = dist[u] + w;
    49                 if(vis[v] == false){
    50                     que.push(v);
    51                 }
    52             }
    53         }
    54     }
    55 }
    56 
    57 
    58 int dfs(int u)
    59 {
    60     if(u == 2)
    61         return 1;
    62     if(dp[u] > 0){
    63         return dp[u];
    64     }
    65     for(int i = 0; i < E[u].size(); ++ i){
    66         int v = E[u][i].v;
    67         if(dist[u] > dist[v]){
    68             dp[u] += dfs(v);
    69         }
    70     }
    71     return dp[u];
    72 }
    73 
    74 int main()
    75 {
    76     while(scanf("%d", &n) && n){
    77         scanf("%d", &m);
    78         init();
    79         for(int i = 1; i <= m; ++ i){
    80             int a, b, d;
    81             scanf("%d%d%d", &a, &b, &d);
    82             addEdge(a, b, d);
    83         }
    84         spfa(2);
    85         printf("%d
    ", dfs(1));
    86     }
    87 }
  • 相关阅读:
    转 oracle catalog 库常用脚本
    转 【ORACLE】ORA-12537 问题整理
    转 Trace a specific ORA- error
    15%
    MySQL 存储过程
    MySQL 命令行客户机的分隔符
    MySQL 连接join
    MySQL 正则表达式
    MySQL 日期时间函数
    Arthas 快速入门
  • 原文地址:https://www.cnblogs.com/takeoffyoung/p/4567202.html
Copyright © 2020-2023  润新知