UVA10537 Toll! Revisited

來源:互聯網
上載者:User

標籤:des   style   http   color   strong   width   


difkstra + 路徑輸出


The Toll! Revisited
Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu

[Submit]   [Go Back]   [Status]  

Description

Problem GToll! RevisitedInput: Standard Input

Output: Standard Output

Time Limit: 1 Second

 

Sindbad the Sailor sold 66 silver spoons to the Sultan of Samarkand. The selling was quite easy; but delivering was complicated. The items were transported over land, passing through several towns and villages. Each town and village demanded an entry toll. There were no tolls for leaving. The toll for entering a village was simply one item. The toll for entering a town was one piece per 20 items carried. For example, to enter a town carrying70 items, you had to pay 4 items as toll. The towns and villages were situated strategically between rocks, swamps and rivers, so you could not avoid them.

 

Figure 1: To reach Samarkand with 66 spoons, traveling through a town followed by two villages, you must start with 76 spoons.

 

Figure 2: The best route to reach X with 39 spoons, starting from A, is A->b->c->X, shown with arrows in the figure on the left. The best route to reach X with 10 spoons is A->D->X, shown in the figure on the right. The figures display towns as squares and villages as circles.

 

Predicting the tolls charged in each village or town is quite simple, but finding the best route (the cheapest route) is a real challenge. The best route depends upon the number of items carried. For numbers up to 20, villages and towns charge the same. For large numbers of items, it makes sense to avoid towns and travel through more villages, as illustrated in Figure 2.

 

You must write a program to solve Sindbad’s problem. Given the number of items to be delivered to a certain town or village and a road map, your program must determine the total number of items required at the beginning of the journey that uses a cheapest route. You will also have to find the cheapest route. If there is more than one such route, print the lexicographically smallest one (A-n-d is smaller than a-n-d).


Input

The input consists of several test cases. Each test case consists of two parts: the roadmap followed by the delivery details.

 

The first line of the roadmap contains an integer n, which is the number of roads in the map (0 <= n). Each of the next n lines contains exactly two letters representing the two endpoints of a road. A capital letter represents a town; a lower case letter represents a village. Roads can be traveled in either direction.

 

Following the roadmap is a single line for the delivery details. This line consists of three things: an integer p (0 < p < 1000000000) for the number of items that must be delivered, a letter for the starting place, and a letter for the place of delivery. The roadmap is always such that the items can be delivered.

 

The last test case is followed by a line containing the number -1.

 

Output

The output consists of three lines for each test case. First line displays the case number, second line shows the number of items required at the beginning of the journey and third line shows the path according to the problem statement above. Actually, the path contains all the city/village names that Sindbad sees along his journey. Two consecutive city/village names in the path are separated by a hyphen.

 Sample Input                             Output for Sample Input

1

a Z

19 a Z

5

A D

D X

A b

b c

c X

39 A X

-1

Case 1:

20

a-Z

Case 2:44

A-b-c-X

Orignal Problem: ACM ICPC World Finals 2003, Enhanced by SM, Member of EPP

[Submit]   [Go Back]   [Status]  



#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <vector>using namespace std;typedef long long int LL;const LL INF=4557430888798830399LL;int getID(char c){    if(c>='A'&&c<='Z')        return c-'A'+1;    else return c-'a'+27;}struct Edge{    int to,next;}edge[6000];int Adj[60],Size=0;void init(){    memset(Adj,-1,sizeof(Adj)); Size=0;}void Add_Edge(int u,int v){    edge[Size].to=v;    edge[Size].next=Adj[u];    Adj[u]=Size++;}int n,S,E;LL dist[60],toll;bool used[60];LL get_toll(int E,LL toll){    if(E>=27)    {        return toll+1LL;    }    else    {        LL t=toll/19LL;        if(toll%19LL) t++;        return toll+t;    }}int dijkstra(){    memset(dist,63,sizeof(dist));    memset(used,false,sizeof(used));    dist[E]=toll;    for(int j=1;j<=60;j++)    {        int mark=-1;        LL mindist=INF;        for(int i=1;i<=52;i++)        {            if(used[i]) continue;            if(dist[i]<mindist)            {                mark=i; mindist=dist[i];            }        }        if(mark==-1) break;        used[mark]=true;        LL temp=get_toll(mark,dist[mark]);        for(int i=Adj[mark];~i;i=edge[i].next)        {            int v=edge[i].to;            if(used[v]) continue;            if(dist[v]>temp)                dist[v]=temp;        }    }}vector<int> road;LL get_down(int E,LL toll){    if(E>=27)    {        return 1;    }    else    {        LL t=toll/20LL;        if(toll%20LL) t++;        return t;    }}void dfs(int u,int fa){    road.push_back(u);    int temp=9999;    for(int i=Adj[u];~i;i=edge[i].next)    {        int v=edge[i].to;        if(v==fa) continue;        if(dist[u]-get_down(v,dist[u])==dist[v])        {            temp=min(temp,v);        }    }    if(temp!=9999)        dfs(temp,u);}int main(){    int cas=1;    while(scanf("%d",&n)!=EOF&&~n)    {        init();        char opp[2][30];        for(int i=0;i<n;i++)        {            scanf("%s%s",opp[0],opp[1]);            int u=getID(opp[0][0]);            int v=getID(opp[1][0]);            Add_Edge(u,v);            Add_Edge(v,u);        }        scanf("%lld%s%s",&toll,opp[0],opp[1]);        S=getID(opp[0][0]); E=getID(opp[1][0]);        dijkstra();        printf("Case %d:\n%lld\n",cas++,dist[S]);        road.clear();        dfs(S,S);        for(int i=0,sz=road.size();i<sz;i++)        {            if(i) putchar('-');            char xxx;            if(road[i]<=26)                xxx='A'+road[i]-1;            else            {                road[i]-=27;                xxx='a'+road[i];            }            printf("%c",xxx);        }        putchar(10);    }    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.