• HDU--1142


    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1142

    分析:最短路+记忆化搜索。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<algorithm>
     6 #include<vector>
     7 #include<queue>
     8 #define ll long long
     9 #define inf 0x6fffffff
    10 #define maxn 1005
    11 using namespace std;
    12 struct edge
    13 {
    14     int to,time;
    15     edge(int x,int y)
    16     {
    17         to=x;time=y;
    18     }
    19 };
    20 vector<edge>e[maxn];
    21 queue<int>q;
    22 bool vis[maxn];
    23 int d[maxn],n,m,p[maxn];
    24 void spfa(const int s)
    25 {
    26     while(!q.empty())q.pop();
    27     for(int i=1;i<=n;i++)
    28     {
    29         d[i]=inf;
    30         vis[i]=false;
    31     }
    32     d[s]=0;vis[s]=true;
    33     q.push(s);
    34     while(!q.empty())
    35     {
    36         int u=q.front();q.pop();
    37         for(int i=0;i<e[u].size();i++)
    38         {
    39             if(d[e[u][i].to]>d[u]+e[u][i].time)
    40             {
    41                 d[e[u][i].to]=d[u]+e[u][i].time;
    42                 if(!vis[e[u][i].to])
    43                 {
    44                     vis[e[u][i].to]=true;
    45                     q.push(e[u][i].to);
    46                 }
    47             }
    48         }
    49         vis[u]=false;
    50     }
    51 }
    52 int dfs(int s)//记忆化搜索 
    53 {
    54     if(p[s])return p[s];
    55     if(s==2)return 1;
    56     int sum=0;
    57     for(int i=0;i<e[s].size();i++)
    58     {
    59         if(d[s]>d[e[s][i].to])
    60         {
    61             if(p[e[s][i].to])sum+=p[e[s][i].to];
    62             else sum+=dfs(e[s][i].to);
    63         }
    64     }
    65     p[s]=sum;
    66     return sum;
    67 }
    68 int main()
    69 {
    70     while(~scanf("%d",&n),n)
    71     {
    72         for(int i=0;i<maxn;i++)e[i].clear();
    73         scanf("%d",&m);
    74         int u,v,t,ans=0;
    75         for(int i=0;i<m;i++)
    76         {
    77             scanf("%d%d%d",&u,&v,&t);
    78             e[u].push_back(edge(v,t));
    79             e[v].push_back(edge(u,t));
    80         }
    81         spfa(2);
    82         memset(p,0,sizeof(p));
    83          ans=dfs(1);
    84         printf("%d
    ",ans);
    85     }
    86     return 0;
    87 }
    View Code
  • 相关阅读:
    解决mongod端口占用问题
    MongoDB操作
    ssh 带密码私钥 输入密码
    sequence
    使用plsql导入dmp文件缺少imp*.exe
    oracle查看锁表进程,杀掉锁表进程
    oracle
    常用shell命令
    ORA-03113: end-of-file on & ORA-07445
    ORA-39126: Worker unexpected fatal error in KUPW$WORKER.PUT_DDLS
  • 原文地址:https://www.cnblogs.com/i-love-acm/p/3288388.html
Copyright © 2020-2023  润新知