传送门:http://poj.org/problem?id=2253
解题思路:
参考:http://www.cnblogs.com/freezhan/p/3238967.html
题目求的是青蛙从一个石头跳到另一个石头,它最大的一步只需要多大。
实现代码:
注意:用G++提交没有通过,c++过了
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; const int maxn=205; struct Point{ double x,y; }p[maxn]; double w[maxn][maxn]; double dist(Point a,Point b){ return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } void floyd(int n){ for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) w[i][j]=min(w[i][j],max(w[i][k],w[k][j])); } void init(int n){ for(int i=1;i<=n;i++){ w[i][i]=0; for(int j=i+1;j<=n;j++) w[i][j]=w[j][i]=dist(p[i],p[j]); } } int main(){ int n; int t=0; while(scanf("%d",&n)!=EOF){ if(n==0) break; for(int i=1;i<=n;i++){ scanf("%lf%lf",&p[i].x,&p[i].y); } init(n); floyd(n); printf("Scenario #%d ", ++t); printf("Frog Distance = %.3lf ", w[1][2]); } }
Dijkstra方法:
#include <iostream> #include <cstring> #include <algorithm> #include <cstdio> #include <queue> #include <cmath> using namespace std; const int V=205; const double INF=99999999999; struct Point{ double x,y; }p[V]; struct NodeHeap{ int d,u; NodeHeap(int _d,int _u){ d=_d; u=_u; } bool operator <(const NodeHeap &rhs)const{ return d>rhs.d; } }; double w[V][V],dis[V]; int vis[V]; double dist(Point a,Point b){ return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } void init(int n){ for(int i=1;i<=n;i++){ w[i][i]=0; for(int j=i+1;j<=n;j++){ w[i][j]=dist(p[i],p[j]); w[j][i]=w[i][j]; } } } double Dijkstra(int n){ init(n); double ans=0; for(int i=0;i<=n;i++){ dis[i]=INF; vis[i]=0; } priority_queue<NodeHeap> pq; pq.push(NodeHeap(0,1)); dis[1]=0; vis[1]=1; while(!pq.empty()){ NodeHeap x=pq.top(); pq.pop(); int u=x.u; vis[u]=1; if(ans<dis[u]&&dis[u]!=INF){ ans=dis[u]; } if(u==2) return ans; for(int i=1;i<=n;i++){ if(!vis[i]){ dis[i]=min(dis[i],w[i][u]); pq.push(NodeHeap(dis[i],i)); } } } return ans; } int main(){ int k=0; int n; while(scanf("%d",&n)!=EOF){ if(n==0) break; for(int i=1;i<=n;i++){ scanf("%lf%lf",&p[i].x,&p[i].y); } printf("Scenario #%d ",++k); printf("Frog Distance = %.3f ",Dijkstra(n)); } return 0; }