zoukankan      html  css  js  c++  java
  • HDOJ 2544 Dijkstra

    迪杰斯特拉算法的过程如下:

    初始化,把除起点之外的所有点到起点的距离初始化为 INF,起点到起点的距离记为0,标记清空,;

    FOR i = 1:n

      选取到起点距离最近的结点;

      如果选取的点为目标点,结束,否则标记这个点,并对它相邻的所有点进行松弛操作;

    END

    -----------------------------------------------------------------------------------

    # include <stdio.h>
    # include <string.h>
    
    # define N 105
    # define INF 100005
    
    int n, m;
    int w[N][N];
    
    int min(int x, int y)
    {
        return (x<y ? x:y);
    }
    
    void init(void)
    {
        int i, j, u, v, t;
        
        for (i = 1; i <= n; ++i)
        for (j = 1; j <= n; ++j)
        {
            w[i][j] = INF;
        }
    
        for (i = 0; i < m; ++i)
        {
            scanf("%d%d%d", &u, &v, &t);
            if (t < w[u][v]) w[u][v] = w[v][u] = t;
        }
    }
    
    void solve(void)
    {
        int d[N], i, m, x, j;
        char v[N];
        
        memset(v, 0, sizeof(v));
        for (d[1] = 0, i = 2; i <= n; ++i)
            d[i] = INF;
        for (i = 1; i <= n; ++i)
        {
            m = INF;
            for (j = 1; j <= n; ++j) if (!v[j] && d[j]<=m) m = d[x = j];
            if (x == n) break;
            v[x] = 1;
            for (j = 1; j <= n; ++j) d[j] = min(d[j], d[x]+w[x][j]);
        }
        printf("%d\n", d[n]);
    }
    
    int main()
    {    
        while (scanf("%d%d", &n, &m), n&&m)
        {
            init();
            solve();
        }
    
        return 0;
    }

    ------------------------------------------------------------------------------

  • 相关阅读:
    hdu 1104 数论+bfs
    hdu 1019 最小公倍数
    hdu 1005 数论 循环
    山东省第三届acm
    hdu 1576
    浏览器支持
    FormData
    获取APP图片资源
    链接转标签
    bug20170125
  • 原文地址:https://www.cnblogs.com/JMDWQ/p/2584122.html
Copyright © 2011-2022 走看看