POJ2253 Frogger

我的思路是二分出答案,然后跑n3的弗洛伊德判断当以这个答案作为最大值时,能不能到目的

但是t了,一想,

200*200*200=800,0000;

极限情况是32

32个八百万,爆炸了。

 

错误代码:

(t了但是理论上可行

#include <iostream>
#include <math.h>
#include <string.h>
#include <vector>
#include <map>
#include <queue>
#include <stdio.h>
#include <algorithm>
#include <cstdio>
using namespace std;
int n,reach[500][500];
double x[2000],y[2000];
int main( )
{
    
//    freopen("crazylys.in","r",stdin);
    int cnt=0;
    
    while(cin>>n)
    {  cnt++;
    
        if(n==0)
        {
            break;
        }
        
        for(int i=1;i<=n;i++)
         {
             cin>>x[i]>>y[i];
         }
         
         
         double maxn=0.0;
         
         for(int i=1;i<=n;i++)
          for(int j=1;j<=n;j++)
           {
                 maxn=max(maxn,sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])));
           }
           
           double r=maxn,l=0,mid;
           
          while(l<r)
          {
              mid=(l+r)/2;
              
              
              memset(reach,0,sizeof(reach));
              
              for(int i=1;i<=n;i++)
               for(int j=1;j<=n;j++)
                {
                  if(mid-sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]))>=0.0000001)
                      {
                        reach[i][j]=1;
                    reach[j][i]=1;    
                  }
              }
              
              
           for(int k=1;k<=n;k++)    
              for(int i=1;i<=n;i++)
               for(int j=1;j<=n;j++)
                {
                    if(reach[i][k]==1&&reach[j][k]==1)
                     {
                        reach[i][j]=1;    
                     }
                }
                
                if(reach[1][2]==1)
                {
                   r=mid; 
                }
                else {
                    l=mid+0.0000001;
                }
          }
          /*
          Scenario #1
Frog Distance = 5.000
*/
          printf("Scenario #%d\n",cnt);
          
          printf("Frog Distance = %.3lf\n",r);
    }
}

 

题意是,找到一个边中的最大值,使得这个最大值比其他路径都小。

不行我要抢救弗洛伊德,我觉得它能用,虽然只能顶一次。

 

...要保证一路上可能的最大值最小啊,那在转移的时候,我们不考虑边权,

根据题意修改:

 reach[i][j]=min(reach[i][j],max(reach[i][k],reach[k][j]));
#include <iostream>
#include <math.h>
#include <string.h>
#include <vector>
#include <map>
#include <queue>
#include <stdio.h>
#include <algorithm>
#include <cstdio>
using namespace std;
int n;
double x[2000],y[2000],reach[500][500];
int main( )
{
    
//    freopen("crazylys.in","r",stdin);
    int cnt=0;
    
    while(cin>>n)
    {  cnt++;
    
        if(n==0)
        {
            break;
        }
        
        for(int i=1;i<=n;i++)
         {
             cin>>x[i]>>y[i];
         }
         
         
         double maxn=0.0;
         
         for(int i=1;i<=n;i++)
          for(int j=1;j<=n;j++)
           {
                 reach[i][j]=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
                 reach[j][i]=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
           }

                    
           for(int k=1;k<=n;k++)    
              for(int i=1;i<=n;i++)
               for(int j=1;j<=n;j++)
                {
                      reach[i][j]=min(reach[i][j],max(reach[i][k],reach[k][j]));
              }
                
            
            
            
          printf("Scenario #%d\n",cnt);
          
          printf("Frog Distance = %.3lf\n\n",reach[1][2]);
          }
    }

 

posted @ 2021-09-29 17:59  liyishui  阅读(20)  评论(0编辑  收藏  举报