Here We Go(relians) Again

Here We Go(relians) Again

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 235 Accepted Submission(s): 146
 

Problem Description

The Gorelians are a warlike race that travel the universe conquering new worlds as a form of recreation. Given their violent, fun-loving nature, keeping their leaders alive is of serious concern. Part of the Gorelian security plan involves changing the traffic patterns of their cities on a daily basis, and routing all Gorelian Government Officials to the Government Building by the fastest possible route.

Fortunately for the Gorelian Minister of Traffic (that would be you), all Gorelian cities are laid out as a rectangular grid of blocks, where each block is a square measuring 2520 rels per side (a rel is the Gorelian Official Unit of Distance). The speed limit between two adjacent intersections is always constant, and may range from 1 to 9 rels per blip (a blip, of course, being the Gorelian Official Unit of Time). Since Gorelians have outlawed decimal numbers as unholy (hey, if you\\\\\\\‘re the dominant force in the known universe, you can outlaw whatever you want), speed limits are always integer values. This explains why Gorelian blocks are precisely 2520 rels in length: 2520 is the least common multiple of the integers 1 through 9. Thus, the time required to travel between two adjacent intersections is always an integer number of blips.

In all Gorelian cities, Government Housing is always at the northwest corner of the city, while the Government Building is always at the southeast corner. Streets between intersections might be one-way or two-way, or possibly even closed for repair (all this tinkering with traffic patterns causes a lot of accidents). Your job, given the details of speed limits, street directions, and street closures for a Gorelian city, is to determine the fastest route from Government Housing to the Government Building. (It is possible, due to street directions and closures, that no route exists, in which case a Gorelian Official Temporary Holiday is declared, and the Gorelian Officials take the day off.)

The picture above shows a Gorelian City marked with speed limits, one way streets, and one closed street. It is assumed that streets are always traveled at the exact posted speed limit, and that turning a corner takes zero time. Under these conditions, you should be able to determine that the fastest route from Government Housing to the Government Building in this city is 1715 blips. And if the next day, the only change is that the closed road is opened to two way traffic at 9 rels per blip, the fastest route becomes 1295 blips. On the other hand, suppose the three one-way streets are switched from southbound to northbound (with the closed road remaining closed). In that case, no route would be possible and the day would be declared a holiday.


Input

The input consists of a set of cities for which you must find a fastest route if one exists. The first line of an input case contains two integers, which are the vertical and horizontal number of city blocks, respectively. The smallest city is a single block, or 1 by 1, and the largest city is 20 by 20 blocks. The remainder of the input specifies speed limits and traffic directions for streets between intersections, one row of street segments at a time. The first line of the input (after the dimensions line) contains the data for the northernmost east-west street segments. The next line contains the data for the northernmost row of north-south street segments. Then the next row of east-west streets, then north-south streets, and so on, until the southernmost row of east-west streets. Speed limits and directions of travel are specified in order from west to east, and each consists of an integer from 0 to 9 indicating speed limit, and a symbol indicating which direction traffic may flow. A zero speed limit means the road is closed. All digits and symbols are delimited by a single space. For east-west streets, the symbol will be an asterisk \\\\\\\‘*\\\\\\\‘ which indicates travel is allowed in both directions, a less-than symbol \\\\\\\‘<\\\\\\\‘ which indicates travel is allowed only in an east-to-west direction, or a greater-than symbol \\\\\\\‘>\\\\\\\‘ which indicates travel is allowed only in a west-to-east direction. For north-south streets, an asterisk again indicates travel is allowed in either direction, a lowercase \\\\\\\"vee\\\\\\\" character \\\\\\\‘v\\\\\\\‘ indicates travel is allowed only in a north-to-south directions, and a caret symbol \\\\\\\‘^\\\\\\\‘ indicates travel is allowed only in a south-to-north direction. A zero speed, indicating a closed road, is always followed by an asterisk. Input cities continue in this manner until a value of zero is specified for both the vertical and horizontal dimensions.


Output

For each input scenario, output a line specifying the integer number of blips of the shortest route, a space, and then the word \\\\\\\"blips\\\\\\\". For scenarios which have no route, output a line with the word \\\\\\\"Holiday\\\\\\\".


Sample Input

2 2
9 * 9 *
6 v 0 * 8 v
3 * 7 *
3 * 6 v 3 *
4 * 8 *
2 2
9 * 9 *
6 v 9 * 8 v
3 * 7 *
3 * 6 v 3 *
4 * 8 *
2 2
9 * 9 *
6 ^ 0 * 8 ^
3 * 7 *
3 * 6 ^ 3 *
4 * 8 *
0 0


Sample Output

1715 blips
1295 blips
Holiday

 

Source

Mid-Central USA 2007


Recommend

teddy

/*
n*m的矩阵,然后求最短路,
。——。——。
|   |    |
。——。——。

|   |    |
。——。——。
从上往下每一行的边,一次输入然后*表示双向,<>^V分别表示上下左右单向联通
*/
//#include<bits/stdc++.h>
#include<iostream>
#include<stdio.h>
#include<string.h>
#define N 1100
#define INF 0x3f3f3f3f
using namespace std;
int mapn[N][N];//最大是21*21个点
int n,m;
int all;
int vis[N*N];
int dis[N*N];
int val;
char op[2];
void dijkstra(int s){
    memset(vis,0,sizeof vis);
    int i,j,minn,pos;
    memset(vis,0,sizeof(vis));
    for(i = 1; i<=all; i++)
        dis[i] = mapn[s][i];
    dis[s]=0;
    vis[s]=1;
    for(i = 1; i<=all; i++){
        minn = INF;
        for(j = 1; j<=all; j++){
            if(dis[j]<minn && !vis[j]){
                pos = j;
                minn = dis[j];
            }
        }
        vis[pos] = 1;
        for(j = 1; j<=all; j++){
            if(dis[pos]+mapn[pos][j]<dis[j] && !vis[j])
                dis[j] = dis[pos]+mapn[pos][j];
        }
    }
}
int main()
{
    //freopen("C:\\Users\\acer\\Desktop\\in.txt","r",stdin);
    while(scanf("%d%d",&n,&m)!=EOF&&(n+m)){
        /**********************处理输入***************************/
        all=(n+1)*(m+1);
        getchar();
        /*初始化*/
        for(int i=0;i<=all;i++){
            for(int j=0;j<=all;j++){
                mapn[i][j]=INF;
            }
            mapn[i][i]=0;
        }
        for(int i=1;i<=n*2+1;i++){
            if(i%2){//如果是奇数行,输入横着的边
                /*
                这一行的点是(i-1)*m+j
                */
                for(int j=1;j<=m;j++){
                    scanf("%d %s",&val,op);
                    //cout<<val<<" "<<op<<" ";
                    if(val==0) continue;
                    if(op[0]==‘*‘){
                            mapn[((i+1)/2-1)*(m+1)+j][((i+1)/2-1)*(m+1)+j+1]=mapn[((i+1)/2-1)*(m+1)+j+1][((i+1)/2-1)*(m+1)+j]=2520/val;
                    }
                    else if(op[0]==‘<‘){
                            mapn[((i+1)/2-1)*(m+1)+j+1][((i+1)/2-1)*(m+1)+j]=2520/val;
                    }
                    else if(op[0]==‘>‘){
                            mapn[((i+1)/2-1)*(m+1)+j][((i+1)/2-1)*(m+1)+j+1]=2520/val;
                    }
                }
            }
            else{//为偶数行的时候
                /*
                这一行第一个点是(i-1)*m+j
                */
                for(int j=1;j<=m+1;j++){
                    scanf("%d%s",&val,&op);
                    //cout<<val<<" "<<op<<" ";
                    if(val==0) continue;
                    if(op[0]==‘*‘){
                            mapn[(i/2-1)*(m+1)+j][(i/2)*(m+1)+j]=mapn[(i/2)*(m+1)+j][(i/2-1)*(m+1)+j]=2520/val;
                    }
                    else if(op[0]==‘^‘){//上
                            mapn[(i/2)*(m+1)+j][(i/2-1)*(m+1)+j]=2520/val;
                    }
                    else if(op[0]==‘v‘){//下
                            mapn[(i/2-1)*(m+1)+j][(i/2)*(m+1)+j]=2520/val;
                    }
                }
            }
            getchar();
            //cout<<endl;
        }
        /**********************处理输入***************************/
        /*
        for(int i=1;i<=all;i++){
            for(int j=1;j<=all;j++){
                cout<<mapn[i][j]<<" ";
            }
            cout<<endl;
        }
        */
        dijkstra(1);
        if(dis[all]==INF) puts("Holiday");
        else printf("%d blips\n",dis[all]);
    }
    return 0;
}
时间: 2024-11-09 21:51:19

Here We Go(relians) Again的相关文章

HDU 2722 Here We Go(relians) Again (spfa)

Here We Go(relians) Again Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submission(s) : 1   Accepted Submission(s) : 1 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description The Gorelians

hdu 2722 Here We Go(relians) Again (最短路径)

Here We Go(relians) Again Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 685    Accepted Submission(s): 335 Problem Description The Gorelians are a warlike race that travel the universe conquer

【HDOJ】2722 Here We Go(relians) Again

根据矩阵建图,然后求最短路径. 1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 5 #define L 2520 6 #define MAXN 600 7 #define INF 0x2f2f2f2f 8 9 int map[MAXN][MAXN]; 10 int dis[MAXN]; 11 int path[MAXN]; 12 int vn; 13 bool visit[MAXN]; 14

POJ 3653 &amp; ZOJ 2935 &amp; HDU 2722 Here We Go(relians) Again(最短路dijstra)

题目链接: PKU:http://poj.org/problem?id=3653 ZJU:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1934 HDU:http://acm.hdu.edu.cn/showproblem.php?pid=2722 Description The Gorelians are a warlike race that travel the universe conquering new world

POJ 3653 &amp;amp; ZOJ 2935 &amp;amp; HDU 2722 Here We Go(relians) Again(最短路dijstra)

题目链接: PKU:http://poj.org/problem? id=3653 ZJU:problemId=1934" target="_blank">http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1934 HDU:http://acm.hdu.edu.cn/showproblem.php? pid=2722 Description The Gorelians are a warlike rac

题单二:图论500

http://wenku.baidu.com/link?url=gETLFsWcgddEDRZ334EJOS7qCTab94qw5cor8Es0LINVaGMSgc9nIV-utRIDh--2UwRLvsvJ5tXFjbdpzbjygEdpGehim1i5BfzYgYWxJmu ==========  以下是最小生成树+并查集=========================[HDU]1213         How Many Tables        基础并查集★1272         小

图论五百题!

生死看淡不服就淦,这才是人生! =============================以下是最小生成树+并查集======================================[HDU]1213 How Many Tables 基础并查集★1272 小希的迷宫 基础并查集★1325&&poj1308 Is It A Tree? 基础并查集★1856 More is better 基础并查集★1102 Constructing Roads 基础最小生成树★1232 畅通工程 基

图论 500题——主要为hdu/poj/zoj

转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并查集======================================[HDU]1213   How Many Tables   基础并查集★1272   小希的迷宫   基础并查集★1325&&poj1308  Is It A Tree?   基础并查集★1856   More i

图论精炼500题

忘了从哪转的了... =============================以下是最小生成树+并查集====================================== [HDU] 1213               How Many Tables                    基础并查集★ 1272               小希的迷宫                     基础并查集★ 1325&&poj1308    Is It A Tree?