您的位置:首页 > 其它

hdu 1142 记忆化搜索

2014-05-26 17:51 246 查看
题目是这样的,貌似一开始我这个英语搓的人还理解错了。。。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

;
8 int dist
;
9 int visited
,s
;
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 }


 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: