题意:
从左上角走到右下角,有的最短时间,每段路径的长度都是2520,每段上都有自己的限制速度,方向。
思路:
直接写就行了,就是个最短路,权值是2520/限制,输入的时候细心点就行了。
#include<stdio.h> #include<string.h> #include<queue> #define N_node 500 + 50 #define N_edge 2000 + 200 #define INF 1000000000 using namespace std; typedef struct { int to ,next ,cost; }STAR; STAR E[N_edge]; int list[N_node] ,tot; int s_x[N_node] ,mark[N_node]; void add(int a ,int b ,int c) { E[++tot].to = b; E[tot].cost = c; E[tot].next = list[a]; list[a] = tot; } void Spfa(int s ,int n) { for(int i = 0 ;i <= n ;i ++) s_x[i] = INF ,mark[i] = 0; s_x[s] = 0; mark[s] = 1; queue<int>q; q.push(s); while(!q.empty()) { int xin ,tou; tou = q.front(); q.pop(); mark[tou] = 0; for(int k = list[tou] ;k ;k = E[k].next) { xin = E[k].to; if(s_x[xin] > s_x[tou] + E[k].cost) { s_x[xin] = s_x[tou] + E[k].cost; if(!mark[xin]) { mark[xin] = 1; q.push(xin); } } } } return ; } int main () { int i ,j ,n ,m ,num; char str[10]; while(~scanf("%d %d" ,&n ,&m) && n + m) { int mm = m + 1 ,nn = n + 1; memset(list ,0 ,sizeof(list)) ,tot = 1; for(i = 1 ;i <= nn ;i ++) { for(j = 1 ;j <= m ;j ++) { int now = (i - 1) * mm + j; scanf("%d %s" ,&num ,str); if(!num) continue; num = 2520 / num; if(str[0] == '*') add(now ,now + 1 ,num) ,add(now + 1 ,now ,num); if(str[0] == '>') add(now ,now + 1 ,num); if(str[0] == '<') add(now + 1 ,now ,num); } if(i <= n) for(j = 1 ;j <= mm ;j ++) { scanf("%d %s" ,&num ,str); int now = (i - 1) * mm + j; if(!num) continue; num = 2520 / num; if(str[0] == '*') add(now ,now + mm ,num) ,add(now + mm ,now ,num); if(str[0] == '^') add(now + mm ,now ,num); if(str[0] == 'v') add(now ,now + mm ,num); } } Spfa(1 ,nn * mm); if(s_x[nn * mm] == INF) printf("Holiday "); else printf("%d blips " ,s_x[nn * mm]); } return 0; }