HDU 1142 A Walk Through the Forest dijkstra + DFS

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

题意:

  Jimmy在位置 1 ,每天晚上要回位置2(家),计算1到2的最短距离,Jimmy要先去一个地方然后再回家,到了那个地方离家的距离不能大于1到2

的最短距离,计算出有多少种这样的走法。

 

坑爹:

  当用DFS搜索有多少条路径时会超时。

 

解法:

  剪枝:用mark数组记录上一次走到这一个点在往下走有多少条路径时符合条件的。

 

 

View Code
 1 #include<iostream>
 2 using namespace std;
 3 
 4 const int MAXN = 1000 + 10 ;
 5 const int MAX = 1000000 + 10 ;
 6 
 7 int N;
 8 int M;
 9 int dis[MAXN] ;
10 int map[MAXN][MAXN];
11 int used[MAXN];
12 int mark[MAXN];    // 某点到家的符合条件的路径有多少种
13 int flag[MAXN];    
14 
15 void dijskra(int x)
16 {
17     dis[x] = 0 ;
18     used[x] = 0;
19     
20     for(int j = 0 ; j < N ; j ++ )
21     {
22         int mix = MAX;
23         int y;
24         
25         for( int i = 1 ; i <= N ; i ++ )
26         {
27             if( !used[i] && dis[i] <= mix )
28             {
29                 mix = dis[i] ; 
30                 y = i ;
31             }
32         }
33         
34         used[y] = 1;
35         
36         
37         for( i = 1 ; i <= N ;i ++)
38         {
39             if(!used[i])
40             {
41                 if( dis[i] > dis[y] + map[y][i] && map[y][i]  )
42                 {
43                     dis[i] = dis[y] + map[y][i] ;
44                 }
45             }
46         }
47     }
48 }
49 
50 int DFS(int x)
51 {
52     if(x == 2)
53     {
54         return 1;
55     }
56     
57     if(mark[x] != 0 )
58     {
59         return mark[x];
60     }
61     
62     for( int i = 1 ; i <= N ; i ++ )
63     {
64         if(dis[i] < dis[x] && !flag[i] && map[x][i] )
65         {
66             mark[x] += DFS(i);
67         }
68     }
69     return mark[x];
70 }
71 
72 
73 
74 int main()
75 {
76     while(cin>> N , N )
77     {
78         cin >> M ;
79         memset( map  , 0 ,  sizeof(map)) ;
80         memset( used , 0 , sizeof(used)) ;
81         memset( dis  , MAX, sizeof(dis)) ;
82         memset( mark , 0 , sizeof(mark)) ;
83         memset( flag , 0 , sizeof(flag)) ;
84         
85         for(int i = 0 ; i < M ; i++ )
86         {
87             int a;
88             int b;
89             int c;
90             cin>> a >> b >> c ;
91             map[a][b] = c ;
92             map[b][a] = c ;
93         }
94         
95         dijskra(2);
96         cout<<DFS(1)<<endl;
97     }
98     return 0;
99 }

 

  

转载于:https://www.cnblogs.com/pcpcpc/archive/2012/09/03/2669377.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值