1012
题意:
n*m大小的矩形,起点在矩形的左上角, 终点在右下角,里面一个小矩形代表一个街区(block)。每个小矩形的边长都是2520, 小矩形的边有一个速度限制,范围是0~9, 如果是0表示这条边不能行驶。 数字表示边的限速, 符号表示这条路方向
思路:Dijkstra算法求出最短路径,主要是注意输入
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<utility> using namespace std; typedef pair<int,int>pii; const int INF = 0x7fffffff; const int VN = 445; const int EN = VN*VN/2; struct Edge{ int v, next, w; }E[EN]; int n; int m; int vn; int size; int head[VN]; int d[VN]; void addEdge(int u,int v,int w){ E[size].v=v; E[size].w=w; E[size].next=head[u]; head[u]=size++; } void init(){ vn=(m+1)*(n+1); size=0; memset(head, -1, sizeof(head)); } void Dijkstra(int src){ for(int i=1; i<=vn; ++i)d[i]=INF; d[src]=0; priority_queue<pii,vector<pii>,greater<pii> >q; q.push(make_pair(d[src],src)); while(!q.empty()){ pii x = q.top(); q.pop(); int u=x.second; if(d[u]!=x.first)continue; for(int e=head[u]; e!=-1; e=E[e].next){ int tmp=d[u]+E[e].w; if(d[E[e].v] > tmp){ d[E[e].v] = tmp; q.push(make_pair(tmp,E[e].v)); } } } } int main(){ char str[100]; int u,v,w; while(~scanf("%d%d%*c",&n,&m)&&n+m){ // input init(); for(int i=1; i<=n*2+1; ++i){ gets(str); int len=strlen(str); if(i&1){ for(int j=0,k=1; j<len; j+=4,++k){ u=(m+1)*(i/2)+k; w = str[j]-'0'; if(w==0)continue; if(str[j+2]=='*'){ addEdge(u,u+1,2520/w); addEdge(u+1,u,2520/w); } else if(str[j+2]=='<'){ addEdge(u+1,u,2520/w); } else{ addEdge(u,u+1,2520/w); } } } else{ for(int j=0,k=1; j<len; j+=4,++k){ u = (m+1)*(i/2-1)+k; w = str[j]-'0'; if(w==0) continue; if(str[j+2]=='*'){ addEdge(u, u+m+1, 2520/w); addEdge(u+m+1, u, 2520/w); } else if(str[j+2]=='v'){ addEdge(u, u+m+1, 2520/w); } else if(str[j+2]=='^'){ addEdge(u+m+1, u, 2520/w); } } } } Dijkstra(1); if(d[vn]!=INF) printf("%d blips\n", d[vn]); else puts("Holiday"); } return 0; }