ZJYYCOJ-吃鸡路线

题目链接:http://acm.oinsm.com/problem.php?cid=1022&pid=10

题目后续会在大题库开放!
在这里插入图片描述

题目思路

读完题目,就应该知道是一道模板的最短路径,而且,点的个数最多也就150,那么Floyd或者Dijkstra都可以轻松解决(QAQ,可是我并没有解决…

题目坑点

从s到e,别以为是单向的(QAQ,生活常识也可以知道,

  • 首先: 自己到自己,肯定得为0
  • 其次,可能会有重边记得取min

代码

  • Dijkstra版
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 155;
const int INF = 1e9;
unordered_map<string, int> cityID;
int mp[MAXN][MAXN];
int dist[MAXN];
bool vis[MAXN];
void Dijkstra(int start, int n) {

    dist[start] = 0;

    for(int i = 0; i < n; i++){
        int k = -1, minn = INF;
        for(int j = 0; j < n; j++){
            if(vis[j]) continue;
            if(dist[j] < minn){
                minn = dist[j];
                k = j;
            }
        }
        if(k == -1) return ;        // 说明已经完成,直接退出,
        vis[k] = true;
        for(int j = 0; j < n; j++){
            if(dist[j] > dist[k] + mp[k][j]) {
                dist[j] = dist[k] + mp[k][j];
            }
        }
    }
}
int main()
{
    ios::sync_with_stdio(false);
    int n;
    while(cin >> n && n != -1) {
        int now = 0;
        cityID.clear();
        string cstart, cend;
        cin >> cstart >> cend;
        if(!cityID.count(cstart)) cityID[cstart] = now++;
        if(!cityID.count(cend)) cityID[cend] = now++;
        for(int i = 0; i < MAXN; i++){
            for(int j = i + 1; j < MAXN; j++){
                mp[i][j] = mp[j][i] = INF;
            }
            mp[i][i] = 0;
            dist[i] = INF;
            vis[i] = false;
        }

        for(int i = 1; i <= n; i++){
            string a, b;
            int k;
            cin >> a >> b >> k;
            if(!cityID.count(a)) cityID[a] = now++;
            if(!cityID.count(b)) cityID[b] = now++;
            mp[cityID[a]][cityID[b]] = mp[cityID[b]][cityID[a]] = min(mp[cityID[a]][cityID[b]], k);
        }
        
        Dijkstra(cityID[cstart], now);

        if(dist[cityID[cend]] == INF) {
            cout << -1 << endl;
        }
        else{
            cout << dist[cityID[cend]] << endl;
        }
    }
    return 0;
}
  • Floyd版
#include <bits/stdc++.h>
const long long INF = 1e9;
const long long MAXN = 505;
using namespace std;
unordered_map<string, int> vit;
long long mp[MAXN][MAXN];
int n;
void Floyd(int ms) {
    for(int i = 0; i <= 155; i++){
        mp[i][i] = 0;
    }
    for(int k = 0; k < ms; k++) {
        for(int i = 0; i < ms; i++){
            for(int j = 0; j < ms; j++){
                mp[i][j] = min(mp[i][j], mp[i][k] + mp[k][j]);
            }
        }
    }
}
int main()
{
    ios::sync_with_stdio(false);
    while(cin >> n && n >= 0){
        int now = 0;
        vit.clear();
        string a, b;
        cin >> a >> b;
        if(!vit.count(a)) vit[a] = now++;
        if(!vit.count(b)) vit[b] = now++;
        for(int i = 0; i <= 155; i++){
            for(int j= i + 1; j <= 155; j++){
                mp[i][j] = mp[j][i] = INF;
            }
        }
        for(int i = 1; i <= n; i++){
            string aa, bb;
            long long k;
            cin >> aa >> bb >> k;
            if(!vit.count(aa)) vit[aa] = now++;
            if(!vit.count(bb)) vit[bb] = now++;
            mp[vit[aa]][vit[bb]] = mp[vit[bb]][vit[aa]] = min(k, mp[vit[aa]][vit[bb]]);
        }
        Floyd(now);
        
        if(mp[vit[a]][vit[b]] == INF){
            cout << -1 << endl;
        }
        else{
            cout << mp[vit[a]][vit[b]] << endl;
        }
    }


    return 0;
}

最后

没有最后,溜了溜了,继续了…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值