POJ 2253 Frogger

来源:互联网 发布:pc端护眼软件 编辑:程序博客网 时间:2024/05/01 00:42

题目链接

题意:从0号点,到1号点,找一条能通过的路,使得这条路中的最大的边,比其它所有可能的路中的边都小。

分析:用floyd算法求两点最短值。再求出从每个点开始的最长路,最后从这n个最长路中求出最小的那个即为所求。

#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#define MAX_N 205using namespace std;double dp[MAX_N][MAX_N];const double inf=2000.0;struct node{    double x,y;}pos[MAX_N];int n;void warshall_floyd(){    for(int k=0;k<n;k++)    {        for(int i=0;i<n;i++)        {            for(int j=0;j<n;j++)            dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]);        }    }}int main(void){    int t=0;    while(scanf("%d",&n)==1)    {        if(n==0)        break;        for(int i=0;i<n;i++)        scanf("%lf%lf",&pos[i].x,&pos[i].y);        for(int i=0;i<n;i++)        {            for(int j=i;j<n;j++)            {                if(i==j)                dp[i][j]=0;                else                dp[i][j]=dp[j][i]=sqrt((pos[i].x-pos[j].x)*(pos[i].x-pos[j].x)+(pos[i].y-pos[j].y)*(pos[i].y-pos[j].y));            }        }        warshall_floyd();        for(int k=0;k<n;k++)        {            for(int i=0;i<n;i++)            {                for(int j=0;j<n;j++)                {                    if(dp[i][k]<dp[i][j]&&dp[k][j]<dp[i][j])                    {                        if(dp[i][k]<dp[k][j])                        dp[i][j]=dp[j][i]=dp[k][j];                        else                        dp[i][j]=dp[j][i]=dp[i][k];                    }                }            }        }        printf("Scenario #%d\nFrog Distance = %.3lf\n\n",++t,dp[0][1]);    }    return 0;}
0 0
原创粉丝点击