The question is long... you only need to build a picture.
1: Each block is a square measuring 2520 rels per side.
2: The speed limit between two adjacent intersections is always constant, and may range from 1 to 9 rels per blip
The side length of each edge is 2520, and the speed is 1-9. Therefore, the time = 2520/speed graph is used.
00447988 |
2010-07-05 21:03:02 |
Accepted |
1012 |
MS 15 |
1180 KB |
Visual c ++ |
Slave_wc |
# Include <iostream> <br/> # include <cstring> <br/> # include <queue> <br/> using namespace STD; <br/> # define maxn 500 <br/> const int slave = 2520; <br/> int map [maxn] [maxn]; <br/> int dis [maxn]; <br/> bool hash [maxn]; <br/> struct dij <br/>{< br/> int ID; <br/> int DIS; <br/> bool friend operator <(const dij A, const dij B) <br/>{< br/> return. dis> B. DIS; <br/>}< br/>}; <br/> dij now, next; <br/> int B FS (INT St, int ed, int N) <br/>{< br/> memset (hash, false, sizeof (hash); <br/> memset (DIS, 0x7f, sizeof (DIS); <br/> priority_queue <dij> q; <br/> now. id = sT; <br/> now. dis = 0; <br/> dis [st] = 0; <br/> q. push (now); <br/> while (! Q. empty () <br/>{< br/> now = Q. top (); <br/> q. pop (); <br/> If (hash [now. id]) <br/>{< br/> continue; <br/>}< br/> If (now. id = ed) <br/>{< br/> return now. DIS; <br/>}< br/> hash [now. id] = true; <br/> for (Int J = 1; j <= N; j ++) <br/>{< br/> If (! Hash [J] & dis [J]> dis [now. id] + map [now. id] [J]) <br/>{< br/> dis [J] = dis [now. id] + map [now. id] [J]; <br/> next. id = J; <br/> next. dis = dis [J]; <br/> q. push (next); <br/>}< br/> return-1; <br/>}< br/> int main () <br/> {<br/> int n, m, I, j, A, R, T; <br/> char STR [10]; <br/> while (scanf ("% d", & N, & M )! = EOF) <br/>{< br/> If (n = 0 & M = 0) <br/>{< br/> break; <br/>}< br/> r = 1; <br/> memset (MAP, 0x7f, sizeof (MAP); <br/> for (I = 1; I <= 2 * n + 1; I ++) <br/>{< br/> if (I & 1) <br/> {<br/> for (j = 1; j <= m; j ++) <br/>{< br/> scanf ("% d % s", & A, STR); <br/> if (a = 0) <br/>{< br/> continue; <br/>}< br/> int left = (R-1) * (m + 1) + J; <br/> int right = left + 1; <br/> If (STR [0] = = '*') <Br/>{< br/> T = slave/a; <br/> map [left] [right] = T; <br/> map [right] [left] = T; <br/>}< br/> else if (STR [0] = '> ') <br/>{< br/> T = slave/a; <br/> map [left] [right] = T; <br/>}< br/> else if (STR [0] = '<') <br/>{< br/> T = slave/; <br/> map [right] [left] = T; <br/>}< br/> r ++; <br/>}< br/> else <br/> {<br/> for (j = 1; j <= m + 1; j ++) <br/>{< br/> scanf ("% d % s ", & A, STR); <br/> if (a = 0) <br/>{< br/> continue; <br/>}< br/> int down = (R-1) * (m + 1) + J; <br/> int up = down-(m + 1); <br/> If (STR [0] = '*') <br/>{< br/> T = slave/a; <br/> map [Up] [Down] = T; <br/> map [Down] [Up] = T; <br/>}< br/> else if (STR [0] = '^ ') <br/>{< br/> T = slave/a; <br/> map [Down] [Up] = T; <br/>}< br/> else if (STR [0] = 'V') <br/>{< br/> T = slave/a; <br/> Map [Up] [Down] = T; <br/>}< br/> int ST = 1; <br/> int ED = (n + 1) * (m + 1); <br/> int ans = BFS (St, Ed, Ed ); <br/> If (ANS! =-1) <br/>{< br/> printf ("% d blips/N", ANS ); <br/>}< br/> else <br/>{< br/> puts ("holiday "); <br/>}< br/> return 0; <br/>}< br/>