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 }
原文地址:https://www.cnblogs.com/wally/p/2881732.html