HDU 2722:Here We Go(relians) Again

来源:互联网 发布:linux设置静态ip不生效 编辑:程序博客网 时间:2024/05/20 20:20

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