美文网首页
最短路径手写

最短路径手写

作者: fertilizer | 来源:发表于2017-09-30 10:56 被阅读0次
#include <iostream>
#include <vector>
#include <climits>
using namespace std;
class node {
public:
    int x;
    int y;
    node(int x, int y) {
        this->x = x;
        this->y = y;
    }
    node() {x= 0; y = 0;}

};
int cal(node& a, node& b) {
    return abs(a.x - b.x) + abs(a.y - b.y);
}
int main() {
    int n ;
    cin >> n;
    vector<bool> flag(n ,false);
    vector<node> s;
    vector<int> dist(2 * n + 2, 0);
    int s_x, s_y, d_x, d_y;
    cin >> s_x >> s_y >> d_x >> d_y;

    s.push_back(node(s_x, s_y));
    s.push_back(node(d_x, d_y));
    vector<vector<int>> v(2 * n + 2, vector<int>(2 * n + 2, 0));
    for (int i = 0; i < n; i++) {
        int x1, y1, x2, y2, d;
        cin >> x1 >> y1 >> x2 >> y2 >> d;
        s.push_back(node(x1, y1));
        s.push_back(node(x2, y2));
        v[2 + 2*i][2 + 2 * i + 1] = d;
        v[2 + 2 * i + 1] [2 + 2 * i] = d;
    }
    for (int i = 0; i < 2* n  + 1; i++) {
        for (int j = i + 1; j < 2 *n + 2; j++) {
            if (v[i][j] == 0) {
                v[i][j] = cal(s[i], s[j]);
                v[j][i] = v[i][j];
            }
        }
    }
//    for (int i = 0; i < 2*n + 2; i++) {
//        for (int j = 0; j < 2* n + 2; j++) {
//            cout << v[i][j] << " ";
//        }
//        cout << endl;
//    }
    int len = 2 * n + 2;
    for (int i = 0; i < len; i++) {
        dist[i] = v[0][i];
    }
    flag[0] = true;
    int minval, u;
    for (int i = 0; i < len - 1; i++) {
        minval = 99999;
        for (int j = 0; j < len; j++) {
            if (flag[j] == false && dist[j] < minval) {
                minval = dist[j];
                u = j;
            }
        }
        // cout << u << endl;
        flag[u] = true;
        for (int k = 0; k < len; k++) {
            if (v[u][k] < 99999) {
                if (dist[k] > dist[u] + v[u][k]) {
                    dist[k] = dist[u] + v[u][k];
                }
            }
        }
    }
    cout << dist[2] << endl;
    return 0;
}

三星的笔试题代码基本可以如此操作,难点就是要手写dijkstra算法题

相关文章

  • 最短路径手写

    三星的笔试题代码基本可以如此操作,难点就是要手写dijkstra算法题

  • 头条-手撕代码

    [toc] 图算法 以及最短路径算法 树算法 手写LRU 排序算法 链表算法

  • 图的应用-最短路径求解

    图的最短路径   图的最短路径是一个起点到一个终点之间最短的路径。  用于解决最短路径问题的算法被称做“最短路径算...

  • Yen的K条最短路径算法(KSP)

    一、问题介绍 1.求K条最短路径的必要性 最短路径问题分为: 单源最短路径 所有顶点对间的最短路径 共同的缺陷:这...

  • 最短路径算法

    最短路径算法可以分为两类:单源最短路径问题:从某固定源点出发,求其到所有其他顶点的最短路径。多源最短路径问题:求任...

  • 最短路径 之 Dijkstra 算法

    • 最短路径 之 Floyd 算法• 最短路径 之 Bellman 算法 Dijkstra算法是用于求解单源最短路...

  • 数据结构第二季 Day11 图 Kruskal算法、Dijkst

    一、最短路径基础知识 1、最短路径的定义是什么? 最短路径(Shortest Path):两顶点之间权值之和最小的...

  • 图 求解最短路径 时间复杂度 空间复杂度 单源最短路径 多源最短路径 条数最短(点权为1) 边权之和最小或最大(花...

  • 最短路径问题

    无权图单源最短路径 有权图单源最短路径 有权图单源最短路径和无权图最短路径不一样,不能单从节点数来看,比如上图中,...

  • 最短路径

    最短路径 最短路径:http://baike.baidu.com/view/349189.htmDijkstra算...

网友评论

      本文标题:最短路径手写

      本文链接:https://www.haomeiwen.com/subject/nypgdxtx.html