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


原文地址:https://www.cnblogs.com/robbychan/p/3786785.html