HDU 2722:Here We Go(relians) Again

题目链接: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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值