zoukankan      html  css  js  c++  java
  • hdu 1142 记忆化搜索

    题目是这样的,貌似一开始我这个英语搓的人还理解错了。。。orz

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

    就是最短路,只不过用dijkstra是从终点到源点,然后再dfs从源点开始搜。。。

    好吧,这个记忆化搜索还是挺好用的。。。

    View Code
     1 #include<iostream>
     2 #include<cstring>
     3 const int N=1010;
     4 const int inf=99999999;
     5 using namespace std;
     6 
     7 int edge[N][N];
     8 int dist[N];
     9 int visited[N],s[N];
    10 int n,m;
    11 
    12 void Dijkstra(int v0){
    13     memset(visited,0,sizeof(visited));
    14     for(int i=1;i<=n;i++){
    15         dist[i]=edge[v0][i];
    16     }
    17     dist[v0]=0;
    18     visited[v0]=1;
    19     for(int i=1;i<n;i++){
    20         int min=inf,u=v0;
    21         for(int j=1;j<=n;j++){
    22             if(!visited[j]&&dist[j]<min)
    23                 u=j,min=dist[j];
    24         }
    25         if(min==inf)return ;
    26         visited[u]=1;
    27         for(int k=1;k<=n;k++){
    28             if(!visited[k]&&edge[u][k]<inf&&dist[u]+edge[u][k]<dist[k]){
    29                 dist[k]=edge[u][k]+dist[u];
    30             }
    31         }
    32     }
    33 }
    34 //记忆化搜索
    35 int dfs(int v){
    36     if(s[v]) return s[v];  //如果该点已经访问过了,就返回到该点的路径数
    37     if(v==2)return 1; //找到终点,返回1条路
    38     for(int i=1;i<=n;i++){
    39         if(edge[v][i]<inf&&dist[i]<dist[v]){
    40             s[v]+=dfs(i);
    41         }
    42     }
    43     return s[v]; //返回到该点的所有路径数
    44 }
    45 
    46 int main(){
    47     while(scanf("%d",&n)!=EOF){
    48         if(n==0)break;
    49         scanf("%d",&m);
    50         for(int i=1;i<=n;i++){
    51             for(int j=1;j<=n;j++){
    52                 if(i==j)edge[i][j]=0;
    53                 else edge[i][j]=inf;
    54             }
    55         }
    56         int a,b,dis;
    57         for(int i=1;i<=m;i++){
    58             scanf("%d%d%d",&a,&b,&dis);
    59             if(edge[a][b]>=dis){
    60                 edge[a][b]=edge[b][a]=dis;
    61             }
    62         }
    63         Dijkstra(2);
    64         memset(s,0,sizeof(s));
    65         int count=dfs(1);
    66         printf("%d\n",count);
    67     }
    68     return 0;
    69 }
  • 相关阅读:
    ajax学习笔记
    CSS3伪类
    《HTML5与CSS3基础教程》学习笔记 ——Four Day
    《HTML5与CSS3基础教程》学习笔记 ——Three Day
    《HTML5与CSS3基础教程》学习笔记 ——Two Day
    《HTML5与CSS3基础教程》学习笔记 ——One Day
    js面向对象笔记
    《锋利的jQuery》心得笔记--Four Sections
    《锋利的jQuery》心得笔记--Three Sections
    《锋利的jQuery》心得笔记--Two Sections
  • 原文地址:https://www.cnblogs.com/wally/p/2881732.html
Copyright © 2011-2022 走看看