链接:https://vjudge.net/problem/POJ-2253
题意:
给n个点,求1->2的路径的每段路中的最大值的最短路。
思路:
刚开始看不懂题。看了题解后看明白的。
直接Dijkstra算法,Dis数组保存到每点路径中的路段的最大值。
代码:
#include <iostream> #include <stack> #include <memory.h> #include <string> #include <algorithm> #include <math.h> #include <iomanip> using namespace std; const int MAXN = 200+10; double Map[MAXN][MAXN]; double Dis[MAXN]; int Vis[MAXN]; int n; struct Node { double _x; double _y; }node[MAXN]; double get_Len(Node a,Node b) { return sqrt((a._x-b._x)*(a._x-b._x) + (a._y-b._y)*(a._y-b._y)); } double Dijkstra() { memset(Dis,0, sizeof(Dis)); memset(Vis,0, sizeof(Vis)); for (int i = 2;i<=n;i++) { Dis[i] = Map[1][i]; } Vis[1] = 1; for (int i = 1;i<=n;i++) { int w; double small = 9999999.0; for (int j = 1; j <= n; j++) { if (Vis[j] == 0 && small > Dis[j]) { w = j; small = Dis[j]; } } Vis[w] = 1; if (w == 2) return small; for (int j = 1; j <= n; j++) { if (Vis[j] == 0) { //double now = max(small,Map[w][j]); //if (now < Dis[j]) //Dis[j] = now; Dis[j] = min(Dis[j], max(small, Map[w][j])); } } } } int main() { int cnt = 0; while (cin >> n && n) { for (int i = 1;i<=n;i++) { cin >> node[i]._x; cin >> node[i]._y; } for (int i = 1;i<=n;i++) for (int j = 1;j<=n;j++) Map[i][j] = Map[j][i] = get_Len(node[i],node[j]); double v = Dijkstra(); if (cnt != 0) printf(" "); printf("Scenario #%d Frog Distance = %.3f ",++cnt,v); } }