zoukankan      html  css  js  c++  java
  • POJ 1502_Dijkstra

    /*[任务]dijkstra (单源最短路,图中不能有负权的边。) [perfect!]
    *[说明]Dijkstra算法按从源点src到其他各点的最短路径长度递增的顺序,依次确定src到每个点的最短路。
    * 首先将dis[src]赋为0,其余点的dis赋为INF,此时所有点的最短路都还未确定。之后,每次在还未
    * 确定最短路的点中,取一个当前已得的所有可能的路径长度中最短的那个点确定,设此点为mark.
    * 然后对所有与mark相连的点进行松弛操作,即对于边(mark,v),判断dis[v]是否大于dis[mark]+g[mark][v],
    * 若是,则更新dis[v]为dis[mark]+g[mark][v]。如此做N遍后,即确定了src到所有N个点的最短距离。
    *[接口]void dijkstra(int src, int p);  p 代表 图中的点为 从点 1 到 点 p。src 为源点
    *复杂度:O(n^2)可以堆优化,O(n+m)logn。
    *输入:n 全局变量,图中的点数
    * g 全局变量,g[i][j]表示i到j之间边的距离
    *输出:dis全局变量,dis[i]表示节点src到i的最短距离
    */

    题意:求点1 到其他点的最短路径,然后取它们中的最大值即可

    由于矩阵是对称的,所以题目只给了一个下三角矩阵。

      1 2 3 4 5
    1 0 50 30 100 10
    2 50 0 5 20 x
    3 30 5 0 50 x
    4 100 20 50 0 10
    5 10 x x 10 0


    /**********************************
        Subject: POJ 1502_Dijkstra
        Author : a_clay
        Created Date : 2014-05-06
    *********************************/
    #include <iostream>
    #include <cstring>
    #include <cmath>
    #include <cstdio>
    #include <algorithm>
    
    using namespace std;
    
    const int N = 1000;
    const int INF = 0x7fffffff;
    
    int dis[N], g[N][N], n;
    bool vis[N];
    char str[10];
    
    bool isdec(char str[]) {
        if(str[0] != 'x') return true;
        return false;
    }
    
    void dijkstra(int src, int p) {
        for (int i = 1; i <= p; ++i) dis[i] = INF;
        dis[src] = 0;
        memset(vis, 0, sizeof(vis));
        for (int i = 1; i <= p; ++i) {
            int mark = -1, mindis = INF;
            for (int j = 1; j <= p; ++j) {
                if (!vis[j] && dis[j] < mindis) {
                    mindis = dis[j];
                    mark = j;
                }
            }
            vis[mark] = 1;
            for (int j = 1; j <= p; ++j)
                if (!vis[j])
                    if (dis[mark] + g[mark][j] > 0)
                        dis[j] = min(dis[j], dis[mark] + g[mark][j]);
        }
    }
    int main() {
        int i, j;
        while(cin >> n) {
            memset(g, 0, sizeof(g));
            for(i = 2; i <= n; i++) {
                for(j = 1; j < i; j++) {
                    cin >> str;
                    int temp = INF;
                    if(isdec(str)) {
                        sscanf(str, "%d", &temp);
                    }
                    g[i][j] = temp;
                    g[j][i] = temp;
                }
            }
            dijkstra(1, n);
            int MAX = 0;
            for(i = 1; i <= n; i++) {
                MAX = max(dis[i], MAX);
            }
            cout << MAX << endl;
        }
        return 0;
    }
    // 12845965	a_clay	1502	Accepted	4636K	16MS	G++	1671B	2014-05-06 20:12:25
    


  • 相关阅读:
    Mysql(7) _常用函数
    Mysql(6)_ 帮助的使用
    Mysql(5)_ 基本数据类型-时间
    Mysql(4)_整型和浮点型
    1 HTTP请求头Header及其作用详解
    Java(35) _JDBC批量插入数据二
    Java(34)_ 用JDBC批量向数据库插入语句
    Java(33)_ JDBC指针移动
    Mysql(3)_ Mycat简介
    Mysql(2)_ binlog文件
  • 原文地址:https://www.cnblogs.com/robbychan/p/3786785.html
Copyright © 2011-2022 走看看