题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=2722
题目翻译:
不得不吐槽,这题题目太长了,还是英文,看的吐了,不过最终还是看明白了。
给出N,M; 则就有(N+1)行,(M+1)列
然后分别给出的是
第一行中相邻列的关系
第二行与第一行同列点的关系
第二行中相邻列的关系
第三行与第二行同列点的关系
第三行中相邻列的关系
所以可以知道接下来会有2*N+1个字符串。
图中的字符,‘0’代表没有路
'1' ~ '9'代表这段路径的限速
*代表这是双向道路
>代表的是由西向东的道路
<代表的是由东向西的道路
^代表的是由南到北的道路
v代表的是由北到南的道路
图中所有道路的长度都是2520.
然后求左上角的点到右下角的点的最短路。
存在输出答案
不存在输出Holiday
AC代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;
const int maxn = 500;
const int INF = 450*450*2520+100;
int Map[maxn][maxn];
char str[500];
int N,M; ///N行M列的城市。
void initMap()
{
for(int i = 0; i < (N+1)*(M+1); i++)
{
Map[i][i] = 0;
for(int j = i+1; j < (N+1)*(M+1); j++)
Map[i][j] = Map[j][i] = INF;
}
}
int dist[maxn],vis[maxn];
void spfa()
{
for(int i = 0; i < (N+1)*(M+1); i++)
{
dist[i] = INF;
vis[i] = 0;
}
dist[0] = 0;
vis[0] = 1;
queue<int>qu;
qu.push(0);
while(!qu.empty())
{
int u = qu.front();
qu.pop();
vis[u] = 0;
for(int i = 0; i < (N+1)*(M+1); i++)
{
if(Map[u][i] < INF)
{
if(dist[u] + Map[u][i] < dist[i])
{
dist[i] = dist[u] + Map[u][i];
if(vis[i] == 0)
{
vis[i] = 1;
qu.push(i);
}
}
}
}
}
}
int main()
{
while(~scanf("%d%d",&N,&M)) ///每行有N+1个,每列有N+1个。
{
if(N == 0 && M == 0)
break;
initMap();
getchar();
for(int i = 1; i <= 2*N+1; i++)
{
gets(str);
int num,u,v;
if(i%2 == 1) ///列与列之间的关系
{
int row = i/2; ///行号
int id = 0;
for(int j = 0; j < strlen(str); j++)
{
if(str[j] == ' ')
continue;
else if(str[j]>='0' && str[j]<='9')
{
if(str[j] == '0')
num = INF;
else
num = str[j]-'0';
}
else
{
u = id;
v = ++id;
u = row*(M+1)+u;
v = row*(M+1)+v;
if(str[j] == '*')
Map[u][v] = Map[v][u] = num;
else if(str[j] == '>')
Map[u][v] = num;
else if(str[j] == '<')
Map[v][u] = num;
}
}
}
else
{
int id = 0;
for(int j = 0; j < strlen(str); j++)
{
if(str[j] == ' ')
continue;
else if(str[j]>='0' && str[j]<='9')
{
if(str[j] == '0')
num = INF;
else
num = str[j]-'0';
}
else
{
v = i/2; ///行号
u = v - 1; ///行号
v = v*(M+1) + id;
u = u*(M+1) + id;
id++;
if(str[j] == '*')
{
Map[u][v] = Map[v][u] = num;
}
else if(str[j] == '^')
Map[v][u] = num;
else if(str[j] == 'v')
Map[u][v] = num;
}
}
}
}
/*for(int i = 0; i < (N+1)*(M+1); i++)
{
for(int j = 0; j < (N+1)*(M+1); j++)
{
if(Map[i][j] == INF)
printf("INF ");
else
printf("%d ",Map[i][j]);
}
printf("\n");
}*/
for(int i = 0; i < (N+1)*(M+1); i++)
for(int j = 0; j < (N+1)*(M+1); j++)
{
if(Map[i][j] > 0 && Map[i][j] < INF)
Map[i][j] = 2520/Map[i][j];
}
spfa();
int d = (N+1)*(M+1)-1;
if(dist[d] < INF)
printf("%d blips\n",dist[d]);
else
printf("Holiday\n");
}
return 0;
}