• 迪杰斯特拉算法--O(n^2)

    #include"iostream"
    #include"cstring"
    #include"cstdio"
    using namespace std;
    const int inf = 0x3f3f3f3f;
    typedef long long LL;
    int map[][];
    int ans[], n, m;
    bool flag[];
    void dij() {
    for(int i = ; i <= n; i++)
    ans[i] = map[][i];
    ans[] = ;
    memset(flag, true, sizeof(flag));
    flag[] = false;
    for(int i = ; i < n; i++) {
    int v, mn = inf;
    for(int j = ; j <= n; j++)
    // 此处建议用 <= 因为map和mx都是初始化为inf,如果用 < 可能一个都找不到导致v是随机值而产生RE。当然也可采用其他方式避免v的随机值;
    if(ans[j] <= mn && flag[j]) {
    mn = ans[j];
    v = j;
    }
    for(int j = ; j <= n; j++)
    if(ans[v] + map[v][j] < ans[j])
    ans[j] = ans[v] + map[v][j];
    flag[v] = false;
    }
    }
    int main() {
    int a, b, c;
    while(scanf("%d%d", &n, &m) && (n || m)) {
    memset(map, inf, sizeof(map));
    while(m--) {
    scanf("%d%d%d", &a, &b, &c);
    if(map[a][b] > c)
    map[a][b] = map[b][a] = c;
    }
    dij();
    printf("%d\n", ans[n]);
    }
    return ;
    }
  • 迪杰斯特拉算法堆优化--O(nlgn) 以链式前向星建图
    #include "bits/stdc++.h"
    using namespace std;
    typedef pair<int, int> PII;
    const int MAXN = ;
    const int INF = 0x3f3f3f3f;
    struct Edge {
    int t, w, n;
    } edge[MAXN << ];
    int tot, tail[MAXN], dis[MAXN];
    bool use[MAXN];
    void add(int u, int v, int w) {
    edge[tot].t = v;
    edge[tot].w = w;
    edge[tot].n = tail[u];
    tail[u] = tot++;
    }
    void dij() {
    memset(dis, INF, sizeof(dis));
    memset(use, false, sizeof(use));
    // PII的first表示权重,second表示节点。后面部分是为了让优先队列每次取最小值
    priority_queue<PII, vector<PII>, greater<PII> > que;
    for (int i = tail[]; i != -; i = edge[i].n) {
    int t = edge[i].t;
    int w = edge[i].w;
    if (w < dis[t]) {
    dis[t] = w;
    que.push({w, t});
    }
    }
    use[] = true;
    while (!que.empty()) {
    int v = que.top().second;
    que.pop();
    if (use[v]) continue;
    use[v] = true;
    for (int i = tail[v]; i != -; i = edge[i].n) {
    int t = edge[i].t;
    int w = edge[i].w;
    if (dis[v] + w < dis[t]) {
    dis[t] = dis[v] + w;
    que.push({dis[t], t});
    }
    }
    }
    }
    int main() {
    int n, m, u, v, w;
    while (scanf("%d%d", &n, &m) && (n || m)) {
    tot = ;
    memset(tail, -, sizeof(tail));
    while (m--) {
    scanf("%d%d%d", &u, &v, &w);
    add(u, v, w);
    add(v, u, w);
    }
    dij();
    printf("%d\n", dis[n]);
    }
    return ;
    }
  • 迪杰斯特拉算法堆优化--O(nlgn) 以vector建图
    #include "bits/stdc++.h"
    using namespace std;
    typedef pair<int, int> PII;
    const int MAXN = ;
    const int INF = 0x3f3f3f3f;
    vector<PII> vc[MAXN];
    int dis[MAXN];
    bool use[MAXN];
    void dij() {
    memset(dis, INF, sizeof(dis));
    memset(use, false, sizeof(use));
    priority_queue<PII, vector<PII>, greater<PII> > que;
    for (int i = ; i < vc[].size(); i++) {
    PII p = vc[][i];
    if (p.second < dis[p.first]) {
    dis[p.first] = p.second;
    que.push({dis[p.first], p.first});
    }
    }
    use[] = true;
    while (!que.empty()) {
    int v = que.top().second;
    que.pop();
    if (use[v]) continue;
    use[v] = true;
    for (int i = ; i < vc[v].size(); i++) {
    PII p = vc[v][i];
    if (dis[v] + p.second < dis[p.first]) {
    dis[p.first] = dis[v] + p.second;
    que.push({dis[p.first], p.first});
    }
    }
    }
    }
    int main() {
    int n, m, u, v, w;
    while (scanf("%d%d", &n, &m) && (n || m)) {
    for (int i = ; i <= n; i++) vc[i].clear();
    while (m--) {
    scanf("%d%d%d", &u, &v, &w);
    vc[u].push_back({v, w});
    vc[v].push_back({u, w});
    }
    dij();
    printf("%d\n", dis[n]);
    }
    return ;
    }
  • 弗洛伊德算法--O(n^3)
    #include"iostream"
    #include"cstring"
    #include"cstdio"
    using namespace std;
    const int inf = 0x3f3f3f3f;
    typedef long long LL;
    int map[][];
    int n, m;
    void Floyd() {
    for(int k = ; k <= n; k++)
    for(int i = ; i <= n; i++)
    for(int j = ; j <= n; j++)
    if(map[i][k] + map[k][j] < map[i][j])
    map[i][j] = map[i][k] + map[k][j];
    }
    int main() {
    int a, b, c;
    while(scanf("%d%d", &n, &m) && (n || m)) {
    memset(map, inf, sizeof(map));
    while(m--) {
    scanf("%d%d%d", &a, &b, &c);
    if(map[a][b] > c)
    map[a][b] = map[b][a] = c;
    }
    Floyd();
    printf("%d\n", map[][n]);
    }
    return ;
    }
  • SPFA算法--O(KE)--E是边数,K一般为2-3
    #include"iostream"
    #include"cstring"
    #include"cstdio"
    #include"queue"
    using namespace std;
    const int inf = 0x3f3f3f3f;
    typedef long long LL;
    int map[][];
    int ans[], n, m;
    bool flag[];
    void SPFA() {
    memset(ans, inf, sizeof(ans));
    memset(flag, true, sizeof(flag));
    ans[] = ;
    queue<int>q;
    q.push(); flag[] = false;
    while(!q.empty()) {
    int v = q.front();
    flag[v] = true;
    q.pop();
    for(int i = ; i <= n; i++)
    if(ans[v] + map[v][i] < ans[i]) {
    ans[i] = ans[v] + map[v][i];
    if(flag[i]) {
    q.push(i);
    flag[i] = false;
    }
    }
    }
    }
    int main() {
    int a, b, c;
    while(scanf("%d%d", &n, &m) && (n || m)) {
    memset(map, inf, sizeof(map));
    while(m--) {
    scanf("%d%d%d", &a, &b, &c);
    if(map[a][b] > c)
    map[a][b] = map[b][a] = c;
    }
    SPFA();
    printf("%d\n", ans[n]);
    }
    return ;
    }
  • 深度优先搜索算法
    #include"iostream"
    #include"cstring"
    #include"cstdio"
    #include"queue"
    using namespace std;
    const int inf = 0x3f3f3f3f;
    typedef long long LL;
    int map[][];
    int ans, n, m;
    bool flag[];
    void DFS(int i, int k) {
    if(i == n) {
    if(k < ans)
    ans = k;
    return;
    }
    for(int j = ; j <= n; j++)
    if(flag[j] && k + map[i][j] < ans) {
    flag[j] = false;
    DFS(j, k + map[i][j]);
    flag[j] = true;
    }
    }
    int main() {
    int a, b, c;
    while(scanf("%d%d", &n, &m) && (n || m)) {
    memset(map, inf, sizeof(map));
    while(m--) {
    scanf("%d%d%d", &a, &b, &c);
    if(map[a][b] > c)
    map[a][b] = map[b][a] = c;
    }
    memset(flag, true, sizeof(flag));
    flag[] = false;
    ans = inf; DFS(, );
    printf("%d\n", ans);
    }
    return ;
    }

HDU-2544-最短路(各种最短路径算法)的更多相关文章

  1. HDU - 2544最短路 (dijkstra算法)

    HDU - 2544最短路 Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以 ...

  2. hdu 2544 最短路(SPFA算法)

    本题链接:点击打开链接 本题大意: 首先输入一个n,m.代表有n个点.m条边.然后输入m条边,每条边输入两个点及边权.1为起点,n为终点.输入两个零表示结束. 解题思路: 本题能够使用SPFA算法来做 ...

  3. ACM: HDU 2544 最短路-Dijkstra算法

    HDU 2544最短路 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Descrip ...

  4. UESTC 30 &&HDU 2544最短路【Floyd求解裸题】

    最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  5. hdu 2544 最短路(两点间最短路径)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=2544 方法一:dijkstra算法,求两点之间最短路径. /*********************** ...

  6. HDU 2544最短路 (迪杰斯特拉算法)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=2544 最短路 Time Limit: 5000/1000 MS (Java/Others)    Me ...

  7. hdu 2544 最短路

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=2544 最短路 Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shi ...

  8. 题解报告:hdu 2544 最短路

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544 Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t ...

  9. (重刷)HDU 1874 畅通工程续 + HDU 2544 最短路 最短路水题,dijkstra解法。

    floyd解法 今天初看dijkstra,先拿这两题练手,其他变形题还是不是很懂. 模版题,纯练打字... HDU 1874: #include <cstdio> #define MAXN ...

  10. hdu 2544 最短路 (最短路径)

    最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

随机推荐

  1. Fiddler 断点命令

    Request 断点:bpu /priceCalculate 清除命令:bpu Response 断点:bpafter /priceCalculate 清除命令:bpafter

  2. php IP地址转换

    <?php $enip = ip2long('210.110.11.49); echo $enip."<br />";//-764540111 echo long ...

  3. PHP实现冒泡排序算法相关案例

    <?php /** * 冒泡排序,先找出一个最大的浮上去,然后再依次找最大的浮上去 */ function mpsort($a = []){ $nCount = count($a); if($n ...

  4. PAT Basic 完美数列(25) [two pointers]

    题目 给定⼀个正整数数列,和正整数p,设这个数列中的最⼤值是M,最⼩值是m,如果M <= m * p,则称这个数列是完美数列.现在给定参数p和⼀些正整数,请你从中选择尽可能多的数构成⼀个完美数列 ...

  5. 我是如何从Java转型为Go区块链工程师

    我是如何从Java转型为Go区块链工程师 本文来自于一个比原链核心开发的陈述 前言 IT部落在加入比原链之前一直是做Java开发的,当初看到Go还有点犹豫,还怕过不了面试,结果是否掌握一门语言的考量确 ...

  6. tensroflow中如何计算特征图的输出及padding大小

    根据tensorflow中的conv2d函数,我们先定义几个基本符号 1.输入矩阵 W×W,这里只考虑输入宽高相等的情况,如果不相等,推导方法一样,不多解释. 2.filter矩阵 F×F,卷积核 3 ...

  7. nginx出现No input file specified.

    在lnmp上调试php项目,之前已经在上面测试过tp5框架,可以正常访问.但新项目由于项目中有些路径是写固定路径的.为了不去修改代码.配置新项目的时候,为新项目设置新的目录.问题就出现了,网页提示   ...

  8. Reservoir Computing论文学习

    目录 背景: RC优势: 储备池计算主要理论组成: ESNS数学模型 结构表示 状态方程和输出方程 计算过程 储备池的优化 GA:使用进化算法对参数进行优化: 基于随机梯度下降法的储备池参数优化 参考 ...

  9. 如何保存Keras模型

    我们不推荐使用pickle或cPickle来保存Keras模型 你可以使用model.save(filepath)将Keras模型和权重保存在一个HDF5文件中,该文件将包含: 模型的结构,以便重构该 ...

  10. iOS中代理属性为什么要用Weak修饰?

    一.写在前面 代理设计模式,在iOS开发过程中,是一个非常常见的设计模式,可以说用的范围非常广泛,而对初学者来讲,常常对代理的属性修饰用weak存在疑惑,因此下面就解释一下其中非常简单的道理. 二.必 ...