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]); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)