poj 2253——Frogger

这个题一开始不知道咋做,但是大致有点意思。后来还是借鉴了题解发现可以用dijkstra,不太理解。但是在最后自己推的时候突然理解了。

dijkstra应该也算是动态规划。我们用dis[i]数组作为青蛙跳到第i个石头时途经的最大跳跃距离。借鉴dijkstra的思路,先找最小的dis[i].然后i作为中间点修改dis[j],

1<=j<=n;并且U[i]==0;那么对于修改的时候对于点j如果dis[j]>max(dis[i],arcs[i][j]),那么肯定有修改的必要,新的dis[i]=max(dis[i],arcs[i][j])。至于为什么可以这样呢,其实是和dijkstra的证明类似的,但是这里有一个简单的思路。因为我们一开始对于每个点就有最初的dis[j],当我们可以借助中间点逐渐优化的时候,那么dis[j]肯定是越来越优化的,直到结束。其实这样想有点像floyd。动态规划真的是神奇啊!

Ps:今天历经坎坷,终于组队了。虽然水平都不高,但是距离区域赛还有6个月!we can make it!

 1 #include <iostream>
 2 #include <cstring>
 3 #include <string>
 4 #include <map>
 5 #include <set>
 6 #include <algorithm>
 7 #include <fstream>
 8 #include <cstdio>
 9 #include <cmath>
10 #include <stack>
11 #include <queue>
12 #define lson l,m,rt<<1
13 #define rson m+1,r,rt<<1|1
14 using namespace std;
15 const double Pi=3.14159265358979323846;
16 typedef long long ll;
17 const int MAXN=200+5;
18 const int dx[4]={0,0,1,-1};
19 const int dy[4]={1,-1,0,0};
20 const int INF = 0x3f3f3f3f;
21 const int NINF = 0xc0c0c0c0;
22 const ll mod=1e9+7;
23 struct graph
24 {
25     double weight;
26     double arcs[MAXN][MAXN];
27 }G;
28 struct node{
29     int a,b;
30 }p[MAXN];
31 double dis[MAXN];
32 //v是起点,n是一共的点的个数 
33 //dis[i]记录的是从七点到i,所有路径中的最小单步值 
34 void dijkstra(int v,int n)
35 {
36     int U[MAXN];
37     for(int i=1;i<=n;i++) U[i]=0;
38     for(int i=1;i<=n;i++) dis[i]=INF; dis[v]=0;
39     
40     for(int i=1;i<=n;i++)
41     {
42         double minn=INF;int k=-1;
43         /*for(int j=1;j<=n;j++)
44         {
45             cout <<dis[j]<<" ";
46         }
47         cout <<endl<<"**********"<<endl;*/
48         for(int i=1;i<=n;i++)
49         {
50             if(minn>dis[i]&&U[i]==0)
51             {
52                 minn=dis[i];
53                 k=i;
54             }
55         } 
56         U[k]=1;
57         
58         for(int i=1;i<=n;i++)
59         {
60             if(U[i]==0&&dis[i]>max(G.arcs[i][k],dis[k]))
61             {
62                 dis[i]=max(G.arcs[i][k],dis[k]);
63             }
64         }
65     }
66 }
67 int main()
68 {
69     int n;int cnt=1;
70     while(scanf("%d",&n)&&n)
71     {
72         for(int i=1;i<=n;i++)
73         {
74             scanf("%d%d",&p[i].a,&p[i].b);
75         }
76         for(int i=1;i<n;i++)
77         {
78             for(int j=i+1;j<=n;j++)
79             {
80                 G.arcs[i][j]=sqrt((p[i].a-p[j].a)*(p[i].a-p[j].a)+(p[i].b-p[j].b)*(p[i].b-p[j].b));
81                 G.arcs[j][i]=G.arcs[i][j];
82             }
83         } 
84         dijkstra(1,n);
85         printf("Scenario #%d\n",cnt++);
86         printf("Frog Distance = %.3f\n\n",dis[2]);    
87     }
88     return 0;
89 }
View Code

 

posted @ 2019-03-16 17:24  Chuhanjing  阅读(114)  评论(0编辑  收藏  举报