hdu 1960 Bus System

來源:互聯網
上載者:User

標籤:des   style   blog   http   java   color   

Bus System

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


Problem DescriptionBecause of the huge population of China, public transportation is very important. Bus is an important transportation method in traditional public transportation system. And it’s still playing an important role even now.
The bus system of City X is quite strange. Unlike other city’s system, the cost of ticket is calculated based on the distance between the two stations. Here is a list which describes the relationship between the distance and the cost.



Your neighbor is a person who is a really miser. He asked you to help him to calculate the minimum cost between the two stations he listed. Can you solve this problem for him?
To simplify this problem, you can assume that all the stations are located on a straight line. We use x-coordinates to describe the stations’ positions. 

 

InputThe input consists of several test cases. There is a single number above all, the number of cases. There are no more than 20 cases.
Each case contains eight integers on the first line, which are L1, L2, L3, L4, C1, C2, C3, C4, each number is non-negative and not larger than 1,000,000,000. You can also assume that L1<=L2<=L3<=L4.
Two integers, n and m, are given next, representing the number of the stations and questions. Each of the next n lines contains one integer, representing the x-coordinate of the ith station. Each of the next m lines contains two integers, representing the start point and the destination.
In all of the questions, the start point will be different from the destination.
For each case,2<=N<=100,0<=M<=500, each x-coordinate is between -1,000,000,000 and 1,000,000,000, and no two x-coordinates will have the same value. 

 

OutputFor each question, if the two stations are attainable, print the minimum cost between them. Otherwise, print “Station X and station Y are not attainable.” Use the format in the sample. 

 

Sample Input21 2 3 4 1 3 5 74 212341 44 11 2 3 4 1 3 5 74 1123101 4 

 

Sample OutputCase 1:The minimum cost between station 1 and station 4 is 3.The minimum cost between station 4 and station 1 is 3.Case 2:Station 1 and station 4 are not attainable. 

 

 

       題意:坐公交車不同的距離,所需要的花費是不一樣的,給你8個數,前4個代表不同的距離,後4個代表的是相應的花費,若距離不在所規定的範圍,則不能到達吧。再輸入n和m,分別表示在座標上有n個點,代表不同的座標值,m則代表將要詢問的最短路的次數了。

       解題思路:就是一道dijkstra或floyd的模板題,但要注意資料的大小,要用int64位來計算,而且定義的最大值的是非常大的數。一開始我定義為2^32-1,但結果WA了,後面改了就可以了。

 

Dijkstra貼代碼:

 

#include <stdio.h>#define maxn 1e18__int64 map[105][105], dis[105];int visited[105];void Dijkstra(int start, int n){    __int64 mind;    int pre = start;    for(int i = 1; i<=n; i++)    {        dis[i] = map[start][i];        visited[i] = 0;    }    visited[start] = 1;    for(int i = 1; i<=n; i++)    {        mind = maxn;        for(int j = 1; j<=n; j++)        {            if(!visited[j] && mind > dis[j])            {                mind = dis[j];                pre = j;            }        }        visited[pre] = 1;        for(int j = 1; j<=n; j++)        {            if(!visited[j] && dis[j] > dis[pre]+map[pre][j])                dis[j] = dis[pre]+map[pre][j];        }    }}int main(){    __int64 x, N[105];    int t = 1, T;    int n, m;    int start, finish;    __int64 L1, L2, L3, L4, C1, C2, C3, C4;    scanf("%d", &T);    while(T--)    {        scanf("%I64d%I64d%I64d%I64d%I64d%I64d%I64d%I64d", &L1, &L2, &L3, &L4, &C1, &C2, &C3, &C4);        scanf("%d%d", &n, &m);        for(int i = 1; i<=n; i++)            scanf("%I64d", &N[i]);        for(int i = 1; i<=n; i++)        {            for(int j = 1; j<=n; j++)            {                if(N[i] > N[j])                    x = N[i] - N[j];                else                    x = N[j] - N[i];                if(x>0 && x<=L1)                    map[i][j] = C1;                else if(x>L1 && x<=L2)                    map[i][j] = C2;                else if(x>L2 && x<=L3)                    map[i][j] = C3;                else if(x>L3 && x<=L4)                    map[i][j] = C4;                else                    map[i][j] = maxn;                if(i == j)                    map[i][j] = 0;            }        }        printf("Case %d:\n", t++);        while(m--)        {            scanf("%d%d", &start, &finish);            Dijkstra(start, n);            if(visited[finish])                printf("The minimum cost between station %d and station %d is %I64d.\n", start, finish, dis[finish]);            else                printf("Station %d and station %d are not attainable.\n", start, finish);        }    }    return 0;}

 

Floyd演算法的代碼:

 

#include <stdio.h>#define maxn 1e18__int64 map[105][105], dis[105];void Floyd(int n){    for(int k = 1; k<=n; k++)    {        for(int i = 1; i<=n; i++)        {            for(int j = 1; j<=n; j++)            {                if(map[i][j] > map[i][k]+map[k][j])                    map[i][j] = map[i][k]+map[k][j];            }        }    }}int main(){    __int64 x, N[105];    int t = 1, T;    int n, m;    int start, finish;    __int64 L1, L2, L3, L4, C1, C2, C3, C4;    scanf("%d", &T);    while(T--)    {        scanf("%I64d%I64d%I64d%I64d%I64d%I64d%I64d%I64d", &L1, &L2, &L3, &L4, &C1, &C2, &C3, &C4);        scanf("%d%d", &n, &m);        for(int i = 1; i<=n; i++)            scanf("%I64d", &N[i]);        for(int i = 1; i<=n; i++)        {            for(int j = 1; j<=n; j++)            {                if(N[i] > N[j])                    x = N[i] - N[j];                else                    x = N[j] - N[i];                if(x>0 && x<=L1)                    map[i][j] = C1;                else if(x>L1 && x<=L2)                    map[i][j] = C2;                else if(x>L2 && x<=L3)                    map[i][j] = C3;                else if(x>L3 && x<=L4)                    map[i][j] = C4;                else                    map[i][j] = maxn;                if(i == j)                    map[i][j] = 0;            }        }        Floyd(n);        printf("Case %d:\n", t++);        while(m--)        {            scanf("%d%d", &start, &finish);            if(map[start][finish] != maxn)                printf("The minimum cost between station %d and station %d is %I64d.\n", start, finish, map[start][finish]);            else                printf("Station %d and station %d are not attainable.\n", start, finish);        }    }    return 0;}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.