POJ 2253 Frogger

来源:互联网 发布:淘宝保证金是什么 编辑:程序博客网 时间:2024/06/08 15:34
就是从某点到某点找一条路径,使得这条路径上的最长的长度最短
这个问题,跟最短路的性质类似,所以也可以这样去搞,
if (!vis[j] && max(dist[k], graph[k][j]) < dist[j])
   {
    dist[j] = max(dist[k], graph[k][j]);
    //path[j] = k;
   }
就是dist[j]存储从出发点到该点的路径上的最长边,然后最后搜完就行

#include <cstdio>#include <cstring>#include <iostream>#include <cmath>#include <algorithm>#include <queue>using namespace std;#define ll long long#define ull unsigned long long#define INF 0x3f3f3f3f#define maxn 1005struct Node{int x, y;};int Euclid(Node a, Node b){return (a.x - b.x)*(a.x - b.x) + (a.y - b.y)*(a.y - b.y);}Node stone[maxn];int graph[maxn][maxn];//int path[maxn];bool vis[maxn];int dist[maxn];int n, m;void dijkstra(int s){memset(dist, 0x3f, sizeof(int)*maxn);memset(vis, false, sizeof(vis));//memset(path, -1, sizeof(int)*maxn);dist[s] = 0;for (int i = 0; i < n; ++i){int k = -1, minv = INF;for (int j = 0; j < n; ++j){if (!vis[j] && dist[j] < minv){minv = dist[j];k = j;}}if (k == -1)break;vis[k] = true;//printf("k %d\n", k);for (int j = 0; j < n; ++j){if (!vis[j] && max(dist[k], graph[k][j]) < dist[j]){dist[j] = max(dist[k], graph[k][j]);//path[j] = k;}}}}int main(){//freopen("input.txt", "r", stdin);int kase = 0;while (scanf("%d", &n) != EOF){if (n == 0)break;memset(graph, 0x3f, sizeof(int)*maxn*maxn);for (int i = 0; i < n; ++i){scanf("%d%d", &stone[i].x, &stone[i].y);}for (int i = 0; i < n; ++i){for (int j = i + 1; j < n; ++j){graph[i][j] = Euclid(stone[i], stone[j]);graph[j][i] = graph[i][j];}}/*for (int i = 0; i < n; ++i){for (int j = 0; j < n; ++j)printf("%d ", graph[i][j]);printf("\n");}*/dijkstra(0);int ans = dist[1];printf("Scenario #%d\nFrog Distance = %.3f\n\n", ++kase, sqrt(ans*1.0));}//system("pause");//while (1);return 0;}

0 0