HDU2112-HDU Today(Floyd & Dijkstra)

HDU Today

Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 26744 Accepted Submission(s): 6517

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

Input
输入数据有多组,每组的第一行是公交车的总数N(0 <=N<=10000);
第二行有徐总的所在地start,他的目的地end;
接着有n行,每行有站名s,站名e,以及从s到e的时间整数t(0 < t<100)(每个地名是一个长度不超过30的字符串)。
note:一组数据中地名数不会超过150个。
如果N==-1,表示输入结束。

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

Floyd算法

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
const int inf=0x3f3f3f3f;
const int V_MAX=153;
int e[V_MAX][V_MAX];
int main(){
    ios_base::sync_with_stdio(false);

    int n;
    while(cin>>n,n!=-1){
        for(int i=1;i<=V_MAX;i++)
            for(int j=1;j<=V_MAX;j++)
                if(i==j) e[i][j]=0;
                else e[i][j]=inf;

        map<string,int> m;
        string start,end,t1,t2;
        int t3;
        int q=0;
        cin>>start>>end;
        if(!m[start]) m[start]=++q;
        if(!m[end]) m[end]=++q;

        for(int i=0;i<n;i++){
            cin>>t1>>t2>>t3;
            if(!m[t1])
                m[t1]=++q;
            if(!m[t2])
                m[t2]=++q;
            e[m[t1]][m[t2]] =e[m[t2]] [m[t1]]=t3;
        }
        for(int k=1;k<=q;k++)
            for(int i=1;i<=q;i++)
                for(int j=1;j<=q;j++)
                    e[i][j]=min(e[i][j],e[i][k]+e[k][j] );                      
        if(e[m[start]][m[end]]!=inf)
            cout<<e[m[start]][m[end]]<<endl;
        else
            cout<<"-1"<<endl;
    }
}

Dijkstra算法
用Dijkstra 可以找到最短路径.

#include<cstdio>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<map>
#define INF 0x3f3f3f3f
#define maxn 153
int dist[maxn];
int last[maxn]; 
int visit[maxn];
int graph[maxn][maxn];
int fin_cnt;

void init(int n){
    memset(visit,0,sizeof(visit));
    memset(last,-1,sizeof(last));
    dist[0]=0;
    visit[0]=1;

    for(int i=1;i<n ;i++){
        dist[i]  = graph[0][i];
        if(dist[i] !=INF)
            last[i]=0;
    }
    fin_cnt=1; 
}

void dijkstra(int n){
    int Min,Min_idx;
    while( fin_cnt < n){
        Min=INF;
        Min_idx=-1;
        for(int i=1;i< n;i++){
            if(visit[i]==1) continue;
            if( dist[i] < Min )
                Min=dist[i],Min_idx=i;
        }

        if(Min_idx == -1)  break;
        visit[Min_idx] =1;
        fin_cnt++;

        for(int i=1;i<n ;i++){
            if(visit[i] ==1 ) continue;
            if(dist[Min_idx] + graph[Min_idx][i] < dist[i])
                last[i]=Min_idx,dist[i] = dist[Min_idx]+graph[Min_idx][i];
        }               
    } 

}
using namespace std;
//寻找路径 
void find_path(int i,map<int,string> reverse_m,int deep){
    if(i !=-1){
        find_path(last[i],reverse_m,deep+1);

        cout<<reverse_m[i+1];
        if(deep==0)
            cout<<endl;
        else
            cout<<"->";
    }
}
int main(){
    ios_base::sync_with_stdio(false);
    int n;
    while(cin>>n,n!=-1){
        for(int i=0;i<maxn;i++)
            for(int j=0;j<maxn;j++)
                if(i==j) graph[i][j]=0;
                else graph[i][j]=INF;

        map<string,int> m;
        int q=0;

        string start,end,t1,t2;
        int t3;
        cin>>start>>end;
        if(!m[start])
            m[start] = ++q;
        if(!m[end])
            m[end] = ++q;

        for(int i=0;i<n;i++){
            cin>>t1>>t2>>t3;
            if(m[t1] ==0)
                m[t1]=++q;
            if(m[t2] ==0)
                m[t2]=++q;
            graph[m[t1]-1][m[t2]-1]=graph[m[t2]-1][m[t1]-1] = t3;   
        }   
        init(q);
        dijkstra(q);

        if(dist[m[end]-1] != INF)
            cout<<dist[m[end]-1]<<endl; 
        else
            cout<<-1<<endl;

        /* 寻找路径 map<int,string> reverse_m; for(pair<string,int> x:m){ string fi=x.first; int se=x.second; reverse_m[se]=fi; } find_path(m[end]-1,reverse_m,0); */  
    }
}

    原文作者:Dijkstra算法
    原文地址: https://blog.csdn.net/sUb_569/article/details/54882438
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞