http://acm.hdu.edu.cn/showproblem.php?pid=2722
#include<iostream>
#include<queue>
using namespace std;
#define N 450
#define M 10000
#define inf 0x7fffffff
struct node{
int next,v,w;
node(){};
node(int a,int b,int c){
next=a;v=b;w=c;
}
}E[M];
int head[N],NE;
bool h[N];
int dis[N];
int n,m;
void init(){
NE=0;
memset(head,-1,sizeof(head));
}
void insert(int u,int v,int w){
E[NE]=node(head[u],v,w);
head[u]=NE++;
}
bool update(int u,int v,int w){
if(dis[u]+w<dis[v]){
dis[v]=dis[u]+w;
return true;
}
return false;
}
void spfa(int beg,int end){
queue<int> q;
q.push(beg);
memset(h,0,sizeof(h));
for(int i=0;i<=n*m;i++)
dis[i]=inf;
dis[beg]=0;
while(!q.empty()){
int u=q.front();
q.pop();
h[u]=0;
for(int i=head[u];i!=-1;i=E[i].next){
int v=E[i].v;
if(update(u,v,E[i].w)&&!h[v]){
h[v]=1;
q.push(v);
}
}
}
if(dis[end]==inf)
printf("Holiday\n");
else
printf("%d blips\n",dis[end]);
}
int main(void){
while(scanf("%d%d",&n,&m),n||m){
init();
n++;m++;
int r=2*n-1;
int l,w;
char ch[2];
for(int i=0;i<r;i++){
if(i&1){
l=m;
for(int j=0;j<l;j++){
scanf("%d%s",&w,ch);
int u=(i/2)*m+j;
int v=u+m;
if(w==0) continue;
w=2520/w;
if(ch[0]=='v')
insert(u,v,w);
else if(ch[0]=='^')
insert(v,u,w);
else{
insert(u,v,w);
insert(v,u,w);
}
}
}
else{
l=m-1;
for(int j=0;j<l;j++){
scanf("%d%s",&w,ch);
int u=(i/2)*m+j;
int v=u+1;
if(w==0) continue;
w=2520/w;
if(ch[0]=='>')
insert(u,v,w);
else if(ch[0]=='<')
insert(v,u,w);
else{
insert(u,v,w);
insert(v,u,w);
}
}
}
}
spfa(0,n*m-1);
}
}
建图的时候分奇偶行。。。。要静下来看