题目链接:http://poj.org/problem?id=2253
题目意思:有n个石头的坐标,一只青蛙想从第一个坐标的石头跳到第二的石头上,问最短路径时要跳最长的路长为多少?
思路:就是将dijkstra,floyd中的d[],map[]存储的内容改为最短路中最长边。
有点无语的是,交到G++去了用printf("%.3lf"),精度有点问题wa了很多很多发。。。。
花了我两天,还以为算法错了。结果交c++就过了。真的心态爆炸。。。。
不过发现了一个保存精度的函数setprecision(),头文件是#include<iomanip>,如果要保留无有效位的0时要
加fixed。用法:cout<<fixed<<setprecision(3)<<"Frog Distance = "<<d[2]<<endl;
dijkstra:
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<cmath> #define inf 0x3f3f3f3f using namespace std; typedef long long ll; const int maxn=300; double map[maxn][maxn],d[maxn]; double x[maxn],y[maxn],vis[maxn]; int n; void dijkstra() { d[1]=0; vis[1]=1; for(int i=2;i<=n;i++) { vis[i]=0; d[i]=map[1][i]; } for(int i=1;i<n;i++) { double m=inf; int v; for(int j=1;j<=n;j++) { if(!vis[j]&&m>d[j]) { m=d[j]; v=j; } } vis[v]=1; if(vis[2]) break; //cout<<v<<endl; for(int j=1;j<=n;j++) { if(!vis[j]&&d[j]>max(d[v],map[v][j]))//与模板不同的就是这 d[j]=max(d[v],map[v][j]);//记录到每个点最短路的最长边 } } } int main() { int k=1; while(scanf("%d",&n)!=EOF&&n) { for(int i=1;i<=n;i++) { scanf("%lf%lf",&x[i],&y[i]); } memset(map,0,sizeof(map)); for(int i=1;i<=n;i++) { for(int j=i+1;j<=n;j++) { double sum=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])); map[i][j]=map[j][i]=sum; } } dijkstra(); printf("Scenario #%d\nFrog Distance = %.3lf\n\n",k,d[2]); k++; } return 0; }
floyd:
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<cmath> #include<iomanip> #define inf 0x3f3f3f3f using namespace std; typedef long long ll; const int maxn=300; int main() { int n,t=1; double map[maxn][maxn]; double x[maxn],y[maxn]; while(cin>>n&&n) { memset(map,inf,sizeof(map)); memset(x,0,sizeof(x)); memset(y,0,sizeof(y)); for(int i=1;i<=n;i++) cin>>x[i]>>y[i]; for(int i=1;i<n;i++) { for(int j=i+1;j<=n;j++) { double xx=x[i]-x[j]; double yy=y[i]-y[j]; map[i][j]=map[j][i]=sqrt(xx*xx+yy*yy); } } for(int k=1; k<=n; k++) for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) { if(map[i][j]>max(map[i][k],map[k][j])) map[i][j]=max(map[i][k],map[k][j]); } cout<<"Scenario #"<<t++<<endl; cout<<fixed<<setprecision(3)<<"Frog Distance = "<<map[1][2]<<endl; cout<<endl; } return 0; }
原文地址:https://www.cnblogs.com/xiongtao/p/10022929.html
时间: 2024-10-08 01:31:27