1. 程式人生 > >POJ - 2253(dijkstra和Floyd變形)

POJ - 2253(dijkstra和Floyd變形)

題目連結: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;
}