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]); } }