POJ - 2253(dijkstra和Floyd變形)
阿新 • • 發佈:2018-11-26
題目連結: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; typedeflong 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; }