POJ 2253 Frogger(dij)

 

有两只青蛙,分别在第 1,2,个位子上,其他的位子都是石头,现在青蛙 1 出发找 2,但是他的体力有限,所以要求你寻找一条路径,使得能够到达 2 号点 且 相邻的两块石头的最大距离尽可能的短

将 d 数组表示为从原点 1 到达任意一点 i 的中间任意两块石头的最大距离的最小值 

const int N=200+5;
 
    int n,m,t;
    int i,j,k;
    double d[N];//源点到任一点 i 的最长距离
    double f[N][N];
    bool vis[N];

int x[N],y[N];
double dis(int a,int b)
{
    double xx=x[a]-x[b];
    double yy=y[a]-y[b];
    return sqrt(xx*xx+yy*yy);
}    

void Dijkstra(int s)
{
    for(int i=1;i<=n;i++){
        d[i]=f[s][i];
        vis[i]=0;
    }
    for(int i=1;i<=n;i++){
        int tag=-1;
        double minn=inf*1.0;
        for(int j=1;j<=n;j++){
            if(!vis[j] && minn>d[j]){
                tag=j;
                minn=d[j];
            }
        }
        if(tag==-1) continue;
        vis[tag]=1;
        for(int j=1;j<=n;j++){
            double maxx=max(d[tag],f[tag][j]);
            if(maxx<d[j]) d[j]=maxx;
        }
    }
}
int main()
{
    //IOS;
    int num=0;
    while(sd(n)==1){
        if(n==0) break;
        for(i=1;i<=n;i++) sdd(x[i],y[i]);
        for(i=1;i<=n;i++){
            for(j=i;j<=n;j++){
                if(i==j) f[i][j]=f[j][i]=0;
                else f[i][j]=f[j][i]=dis(i,j);
            }
        }
        Dijkstra(1);
        printf("Scenario #%d\nFrog Distance = %.3f\n\n",++num,d[2]);
    }
    //PAUSE;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/C_Dreamy/article/details/107845872