1. 程式人生 > >poj 2253——Frogger

poj 2253——Frogger

ons map 開始 pre double make 思路 printf iostream

這個題一開始不知道咋做,但是大致有點意思。後來還是借鑒了題解發現可以用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

poj 2253——Frogger