杭电2112

HDU Today

Time Limit: 15000/5000 MS (Java/Others)
Memory Limit: 32768/32768 K (Java/Others)

Problem Description

经过锦囊相助,海东集团终于度过了危机,从此,HDU的发展就一直顺风顺水,到了2050年,集团已经相当规模了,据说进入了钱江肉丝经济开发区500强。这时候,XHD夫妇也退居了二线,并在风景秀美的诸暨市浬浦镇陶姚村买了个房子,开始安度晚年了。
这样住了一段时间,徐总对当地的交通还是不太了解。有时很郁闷,想去一个地方又不知道应该乘什么公交车,在什么地方转车,在什么地方下车(其实徐总自己有车,却一定要与民同乐,这就是徐总的性格)。
徐总经常会问蹩脚的英文问路:“Can you help me?”。看着他那迷茫而又无助的眼神,热心的你能帮帮他吗?
请帮助他用最短的时间到达目的地(假设每一路公交车都只在起点站和终点站停,而且随时都会开)。

Input

输入数据有多组,每组的第一行是公交车的总数N(0<=N<=10000);
第二行有徐总的所在地start,他的目的地end;
接着有n行,每行有站名s,站名e,以及从s到e的时间整数t(0

Output

如果徐总能到达目的地,输出最短的时间;否则,输出“-1”。

Sample Input

6
xiasha westlake
xiasha station 60
xiasha ShoppingCenterofHangZhou 30
station westlake 20
ShoppingCenterofHangZhou supermarket 10
xiasha supermarket 50
supermarket westlake 10
-1

Sample Output

50

思路:

求最短路径长度,dijkstra算法,Floyd算法都能做。
需要用map将输入字符串映射为数字。

AC代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>

#define INF 0xfffffff
#define maxn 10010

using namespace std;

int ttime[maxn][maxn];//两点间距离 
int vis[maxn];//结点是否已经访问过 
int dis[maxn];//到结点的最短距离 

void dijkstra(int s)//src为起始结点 
{
    int k=s,min;
    //初始化所有节点都不在最短路径中 
    memset(vis,0,sizeof(vis));

    //初始化从起始结点到结点i的时间 
    for(int i=1;i<=100;i++)
    {
        dis[i]=ttime[s][i];
    }

    //起始结点到起始结点时间为0,并标记为已走 
    dis[s]=0;
    vis[s]=1;

    //依次标记n-1个结点 
    for(int i=1;i<=100;i++)
    {
        //初始化 
        min=INF;
        //找到i所直接连通的结点中具有最短时间的结点
        for(int j=1;j<=100;j++)
        {
            if(!vis[j]&&min>dis[j])
            {
                //更新最短时间,保存达这个点 
                min=dis[j];
                k=j;
            }
        }
        //标记这个点
        vis[k]=1;
        dis[k]=min;
        //判断是起始结点到j短,还是经过k连接j更短
        for(int j=1;j<=100;j++)
        {
            if(!vis[j]&&dis[j]>dis[k]+ttime[k][j])
            {
                dis[j]=dis[k]+ttime[k][j];
            }
        }
    }
}

void floyd()
{
    for(int k=1;k<=100;k++)
    {
        for(int i=1;i<=100;i++)
        {
            for(int j=1;j<=100;j++)
            {
                if(ttime[i][k]!=INF)
                {
                    if(ttime[i][j]>ttime[i][k]+ttime[k][j])
                    {
                        ttime[i][j]=ttime[i][k]+ttime[k][j];
                    }
                }
            }
        }
    }
}

int main()
{
    int n,s,t;
    char src[50],dest[50];
    while(cin>>n)
    {
        if(n==-1) break;
        //init
        for(int i=1;i<=100;i++)
        {
            for(int j=1;j<=100;j++)
            {
                ttime[i][j]=ttime[j][i]=INF;
            }
        }

        map<string,int>city;
        //input
        cin>>src>>dest;//起始和目的结点 

        bool flag=0;
        if(strcmp(src,dest)==0) flag=1;//起始和目的是一个地方 

        city[src]=1;//起始结点为1 
        city[dest]=2;//目的结点为2 
        int num=3;//其他结点编号从3开始 

        for(int i=0;i<n;i++)
        {
            cin>>src>>dest>>t;
            if(!city[src]) city[src]=num++;
            if(!city[dest]) city[dest]=num++;
            ttime[city[src]][city[dest]]=ttime[city[dest]][city[src]]=t;
        }
        if(flag!=0) cout<<0<<endl;//起始和目的是一个地方 
        else
        {
            //dijkstra(1);
            //if(dis[2]==INF) cout<<-1<<endl;//没有最短路径 
            //else cout<<dis[2]<<endl;
            floyd();
            if(ttime[1][2]==INF) cout<<-1<<endl;//没有最短路径 
            else cout<<ttime[1][2]<<endl;
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/albert_bolt/article/details/81134128
今日推荐