POJ 2253 Frogger
题意比较难搞懂。实际上就是求到‘2’点的 最小的最大值。说明白点就是:从‘1’到‘2’有多条路,每一条路中肯定有一条最大的边,求的是所有路中最大边最小的那个值。
可以用dij或者spfa搞,松弛操作都一样的。也可以用弗洛伊德,都差不多。下面只贴前两个
spfa:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 | #include<stdio.h> #include<string.h> #include<cstring> #include<string> #include<math.h> #include<queue> #include<algorithm> #include<iostream> #include<stdlib.h> #include<cmath> #define INF 0x3f3f3f3f #define MAX 100005 using namespace std; struct node { int u,v,next; double w; }Map[MAX]; int n,vis[MAX],x[MAX],y[MAX],k,a[MAX]; double dist[MAX]; void Init() { memset (vis,0, sizeof (vis)); for ( int i=0;i<MAX;i++) { a[i]=-1; dist[i]=INF; } } void Add( int u, int v, double w) { Map[k].u=u; Map[k].v=v; Map[k].w=w; Map[k].next=a[u]; a[u]=k++; } void spfa() { queue< int >Q; int start=1,i; dist[1]=0; vis[1]=1; Q.push(start); while (!Q.empty()) { start=Q.front(); Q.pop(); vis[start]=0; for (i=a[start];i!=-1;i=Map[i].next) { int v=Map[i].v; if (dist[v] > dist[start] && dist[v] > Map[i].w) //松弛操作 { dist[v]=max(dist[start],Map[i].w); if (!vis[v]) { vis[v]=1; Q.push(v); } } } } } int main() { int i,j,cas=1; while ( scanf ( "%d" ,&n),n) { Init(); for (i=1;i<=n;i++) { scanf ( "%d%d" ,&x[i],&y[i]); } for (i=1;i<=n;i++) { for (j=i;j<=n;j++) { double num= sqrt ((x[i]-x[j])*(x[i]-x[j])*1.0 + (y[i]-y[j])*(y[i]-y[j])*1.0); Add(i,j,num); Add(j,i,num); } } spfa(); printf ( "Scenario #%d\n" ,cas++); printf ( "Frog Distance = %.3f\n\n" ,dist[2]); } return 0; } |
dij:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | #include<stdio.h> #include<string.h> #include<cstring> #include<string> #include<math.h> #include<queue> #include<algorithm> #include<iostream> #include<stdlib.h> #include<cmath> #define INF 0x3f3f3f3f #define MAX 1005 using namespace std; double dist[MAX],Map[MAX][MAX]; int vis[MAX],n; double dij() { memset (vis,0, sizeof (vis)); int i,j,k,minn; for (i=2;i<=n;i++) dist[i]=Map[1][i]; vis[1]=1; for (i=1;i<n;i++) { minn=INF; for (j=1;j<=n;j++) { if (minn > dist[j] && !vis[j]) { k=j; minn=dist[j]; } } vis[k]=1; for (j=1;j<=n;j++) { if (!vis[j] && dist[j] > dist[k] && dist[j] > Map[k][j]) { dist[j]=max(dist[k],Map[k][j]); } } } return dist[2]; } int main() { int x[MAX],y[MAX],cas=1,i,j; while ( scanf ( "%d" ,&n),n) { for (i=0;i<MAX;i++) for (j=0;j<MAX;j++) Map[i][j]=INF; for (i=1;i<=n;i++) { scanf ( "%d%d" ,&x[i],&y[i]); } for (i=1;i<=n;i++) { for (j=i+1;j<=n;j++) { double k= sqrt ((x[i]-x[j])*(x[i]-x[j])*1.0 + (y[i]-y[j])*(y[i]-y[j])*1.0); Map[i][j]=Map[j][i]=k; } } double ans=dij(); printf ( "Scenario #%d\n" ,cas++); printf ( "Frog Distance = %.3f\n\n" ,ans); } return 0; } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· 《HelloGitHub》第 106 期
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 数据库服务器 SQL Server 版本升级公告
· 深入理解Mybatis分库分表执行原理
· 使用 Dify + LLM 构建精确任务处理应用