/*[任务]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