poj 2253 dijstra变形

dijstra算法的变形,定义:dist[i]为源点到点i的若干路径上的边的最大值的最小值,然后会发现可以用和dijstra一样的贪心方法,当前dist最小的以后都不会再被更新。

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 #include <cmath>
 5 using namespace std;
 6
 7 const int INF = 9999999;
 8 const int N = 201;
 9 int head[N];
10 int dist[N];
11 bool visit[N];
12 int n, e;
13
14 struct Node
15 {
16     int x, y;
17 } node[N];
18
19 struct Edge
20 {
21     int v, next, w;
22 } edge[N * N];
23
24 void addEdge( int u, int v, int w )
25 {
26     edge[e].v = v;
27     edge[e].w = w;
28     edge[e].next = head[u];
29     head[u] = e++;
30 }
31
32 int dis( int i, int j )
33 {
34     return ( node[i].x - node[j].x ) * ( node[i].x - node[j].x ) +
35            ( node[i].y - node[j].y ) * ( node[i].y - node[j].y );
36 }
37
38 void dij( int s )
39 {
40     memset( visit, false, sizeof(visit) );
41     for ( int i = 0; i <= n; i++ )
42     {
43         dist[i] = INF;
44     }
45     dist[s] = 0;
46     for ( int i = 1; i <= n; i++ )
47     {
48         int u = 0;
49         for ( int j = 1; j <= n; j++ )
50         {
51             if ( !visit[j] && dist[j] < dist[u] )
52             {
53                 u = j;
54             }
55         }
56         visit[u] = true;
57         for ( int j = head[u]; j != -1; j = edge[j].next )
58         {
59             int v = edge[j].v, w = edge[j].w;
60             if ( visit[v] ) continue;
61             dist[v] = min( dist[v], max( dist[u], w ) );
62         }
63     }
64 }
65
66 int main ()
67 {
68     int _case = 1;
69     while ( scanf("%d", &n), n )
70     {
71         e = 0;
72         memset( head, -1, sizeof(head) );
73         for ( int i = 1; i <= n; i++ )
74         {
75             scanf("%d%d", &node[i].x, &node[i].y);
76             for ( int j = i - 1; j > 0; j-- )
77             {
78                 int tmp = dis( i, j );
79                 addEdge( i, j, tmp );
80                 addEdge( j, i, tmp );
81             }
82         }
83         dij(1);
84         double ans = sqrt( dist[2] * 1.0 );
85         printf("Scenario #%d\nFrog Distance = %.3lf\n\n", _case++, ans);
86     }
87     return 0;
88 }
时间: 2024-07-31 09:10:17

poj 2253 dijstra变形的相关文章

POJ 2253 kruskal变形

Frogger Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 26226   Accepted: 8538 Description Freddy Frog is sitting on a stone in the middle of a lake. Suddenly he notices Fiona Frog who is sitting on another stone. He plans to visit her,

Floyd-Warshall算法(求解任意两点间的最短路) 详解 + 变形 之 poj 2253 Frogger

/* 好久没有做有关图论的题了,复习一下. --------------------------------------------------------- 任意两点间的最短路(Floyd-Warshall算法) 动态规划: dp[k][i][j] := 节点i可以通过编号1,2...k的节点到达j节点的最短路径. 使用1,2...k的节点,可以分为以下两种情况来讨论: (1)i到j的最短路正好经过节点k一次 dp[k-1][i][k] + dp[k-1][k][j] (2)i到j的最短路完全

POJ 2253 Frogger

题意:一只青蛙找到另外一只青蛙,不过可以通过其它的石头跳到目标青蛙的位置去,其中,输入数据的时候第一组数据是第一只青蛙的位置,第二组是目标青蛙的位置,其它的为石头的位置 思路:dijkstra算法的一种小小的变形,做法还是一样的 Tips:POJ上的双精度浮点型输出竟然是%f输出害的我一直错,或者是编译错误,恼啊! AC代码: #include<cstdio> #include<cmath> #include<algorithm> using namespace std

poj 2253 (dis最短路径)

Frogger Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 24979   Accepted: 8114 Description Freddy Frog is sitting on a stone in the middle of a lake. Suddenly he notices Fiona Frog who is sitting on another stone. He plans to visit her,

poj 2253 Frogger (最长路中的最短路)

链接:poj 2253 题意:给出青蛙A,B和若干石头的坐标,现青蛙A想到青蛙B那,A可通过任意石头到达B, 问从A到B多条路径中的最长边中的最短距离 分析:这题是最短路的变形,以前求的是路径总长的最小值,而此题是通路中最长边的最小值,每条边的权值可以通过坐标算出,因为是单源起点,直接用SPFA算法或dijkstra算法就可以了 SPFA 16MS #include<cstdio> #include<queue> #include<cmath> #include<

[2016-04-02][POJ][2253][Frogger]

时间:2016-04-02 17:55:33 星期六 题目编号:[2016-04-02][POJ][2253][Frogger] 题目大意:给定n个点的坐标,问从起点到终点的所有路径中,最大边的最小值是多少,即每一步至少是多少才能走到终点 分析: 方法1: 枚举出完全图,然后从起点跑一次Dijkstra算法,不过选点不再是选择起点到终点路径的点,而是起点到终点的路径中,边最大边最小的点,即d数组保存起点到当前点的路径中最大边的最小值, 最大边的最小值:u->v d[v] = min(d[i],m

poj 2253

群 #include <stdio.h>#include <math.h> int a[220][220];int x[220],y[220],n;int init(){ int i,j; for(i=0;i<n;i++) scanf("%d%d",&x[i],&y[i]); for(i=0;i<n;i++) for(j=0;j<n;j++) a[i][j]=(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])

POJ 2253 - Frogger (floyd)

A - Frogger Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Description Freddy Frog is sitting on a stone in the middle of a lake. Suddenly he notices Fiona Frog who is sitting on another stone. He plans to

poj 2253 Frogger 解题报告

题目链接:http://poj.org/problem?id=2253 题目意思:找出从Freddy's stone  到  Fiona's stone  最短路中的最长路. 很拗口是吧,举个例子.对于 i 到 j 的一条路径,如果有一个点k, i 到 k 的距离 && k 到 j 的距离都小于 i 到 j 的距离,那么就用这两条中较大的一条来更新 i 到 j 的距离 .每两点之间都这样求出路径.最后输出 1 到 2 的距离(1:Freddy's stone   2:Fiona's sto