Hdu 2112 HDU Today

Hdu 2112 HDU Today(最短路:dijkstra算法)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2112
在这里插入图片描述
在这里插入图片描述
解题思路:唯一麻烦的就是地点全部是字符串,解决办法就是用map把字符串映射成int型再用迪杰斯特拉算法去处理就行,注意一下,最后要特判起点等于终点的时候要把dist值改为0,因为开始会把起点终点映射成两个int值,所以会导致起点和终点是一个点的时候出错。
代码如下:

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f
#define N 105
int val[N][N];
int dist[N],vis[N];
unordered_map<string,int>num;
int n,s,e,ans;
inline void Dijkstra(){
    for(int i=0;i<ans;i++){
        dist[i]=val[s][i];
        vis[i]=0;
    }
    dist[s]=0;
    vis[s]=1;
    for(int i=1;i<ans;i++){
        int minn=inf;
        int a=-1;
        for(int j=0;j<ans;j++){
            if(!vis[j]&&minn>dist[j]){
                minn=dist[j];
                a=j;
            }
        }
        if(a==-1)return;
        vis[a]=1;
        for(int j=0;j<ans;j++){
            if(!vis[j]&&val[a][j]!=inf){
                if(dist[j]>dist[a]+val[a][j]){
                    dist[j]=dist[a]+val[a][j];
                }
            }
        }
    }
}
int main(){
    ios::sync_with_stdio(false);
    while(cin>>n){
        if(n==-1)break;
        string start,end;
        num.clear();//初始化map
        cin>>start>>end;
        num[start]=s=0;//映射
        num[end]=e=1;
        ans=2;
        for(int i=0;i<105;i++){
            for(int j=0;j<105;j++){
                if(i!=j)val[i][j]=inf;
                else val[i][j]=0;
            }
        }
        for(int i=0;i<n;i++){
            string a,b;
            int c;
            cin>>a>>b>>c;
            int aa,bb;
            if(num.find(a)==num.end()){//用map把string映射成int
                num[a]=aa=ans++;
            }else{
                aa=num[a];
            }
            if(num.find(b)==num.end()){
                num[b]=bb=ans++;
            }else{
                bb=num[b];
            }
            val[aa][bb]=val[bb][aa]=c>val[aa][bb]?val[aa][bb]:c;
        }
        Dijkstra();
        if(start==end)dist[1]=0;//避免因为map映射导致的答案错误
        cout<<(dist[1]==inf?-1:dist[1])<<endl;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值