hdu 1142 A Walk Through the Forest

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 1214    Accepted Submission(s): 394

本题的思想就是dfs+dijkstra。本题的意思是,如果在点B出存在一条路使得从B点出发可以比从A点出发跟快的到达home,所以B到home的最短距离要比A到home得最短距离小,所以本题首先要求出各点到home得距离,然后再用记忆搜索法搜索即可

代码:

  
    
1 #include < stdio.h >
2 #include < string .h >
3 #include < queue >
4   using namespace std;
5   int dist[ 1005 ],dp[ 1005 ];
6 typedef struct t
7 {
8 int end,len;
9 struct t * next;
10 }T;
11 struct node
12 {
13 int data;
14 int len;
15 bool operator < ( const node & a) const
16 {
17 return a.len < len;
18 }
19 T * next;
20 }s[ 1005 ];
21 void dijkstra( int v0)
22 {
23 s[v0].len = 0 ;node cur;
24 int visit[ 1005 ],mark = 0 ;
25 memset(visit, 0 , sizeof (visit));
26 memset(dist, - 1 , sizeof (dist));
27 priority_queue < node > qu;
28 qu.push(s[v0]);
29 dist[v0] = 0 ;
30 while ( ! qu.empty ())
31 {
32 cur = qu.top();
33 while (visit[cur.data])
34 {
35 qu.pop();
36 if (qu.empty ())
37 {
38 mark = 1 ;
39 break ;
40 }
41 cur = qu.top();
42 }
43 if (mark)
44 break ;
45 qu.pop();
46 visit[cur.data] = 1 ;
47 T * p = cur.next;
48 while (p)
49 {
50 if ( ! visit[p -> end])
51 {
52 if (dist[p -> end] ==- 1 || dist[cur.data] + p -> len < dist[p -> end] )
53 s[p -> end].len = dist[p -> end] = p -> len + dist[cur.data];
54 qu.push (s[p -> end]);
55 }
56 p = p -> next;
57 }
58 }
59 }
60 int dfs( int v0)
61 {
62 int temp = 0 ;
63 if (v0 == 2 )
64 return 1 ;
65 if (dp[v0] !=- 1 )
66 return dp[v0];
67 t * p = s[v0].next;
68 while (p)
69 {
70 if (dist[v0] > dist[p -> end])
71 {
72 dp[p -> end] = dfs(p -> end);
73 temp += dp[p -> end];
74 }
75 p = p -> next;
76 }
77 return temp;
78 }
79 int main()
80 {
81 int n,i,m,a,b,len;
82 while (scanf( " %d " , & n) != EOF)
83 {
84 if (n == 0 )
85 break ;
86 scanf( " %d " , & m);
87 T * p, * q;
88 for (i = 1 ;i <= n;i ++ )
89 {
90 s[i].next = NULL;
91 s[i].data = i;
92 }
93 memset(dp, - 1 , sizeof (dp));
94 for (i = 1 ;i <= m;i ++ )
95 {
96 scanf( " %d%d%d " , & a, & b, & len);
97 p = (T * )malloc( sizeof (T));
98 p -> end = b;
99 p -> len = len;
100 p -> next = s[a].next;
101 s[a].next = p;
102 q = (T * )malloc( sizeof (T));
103 q -> end = a;
104 q -> len = len;
105 q -> next = s[b].next;
106 s[b].next = q;
107 }
108 dijkstra( 2 );
109 printf( " %d\n " ,dfs( 1 ));
110 }
111 return 0 ;
112 }
113

 

你可能感兴趣的:(REST)