poj2253
2015-08-21 21:57
162 查看
题意:青蛙要从点1出发到点2去,每条边之间距离为权值,中间可能经过很多点,有不同路径,问每条1到2可行路中某一条路径的最大值的最小情况是多少。类似最短路问题,更改一下几个变量定义,用dijkstra,floyed都可以做,也可以等价求最小生成树里最大边的问题。
dijkstra
这里dist[i]定义是,第i个点到起点路径中最大边的边,由于求的是最小的情况,松弛还是用每次确定的最短边进行松弛!
floyed
这里M[i][j]定义是i j两点间最大边的松弛后最小值, M[i][j]=min(M[i][j],max(M[i][k],M[k][j]));。时间复杂度n^3,由于这题只有200个数据,可以用!
最小生成树
构建一个最小生成树,输出最大值!bingo
dijkstra
这里dist[i]定义是,第i个点到起点路径中最大边的边,由于求的是最小的情况,松弛还是用每次确定的最短边进行松弛!
[code]#include<cmath> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n; double dist[210]; bool visit[210]; const double inf=99999999; struct Point { int x,y; }point[210]; double Distance(Point a,Point b) { return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } int main() { int cnt=0; while(~scanf("%d",&n)&&n) { cnt++; for(int i=1;i<=n;i++) scanf("%d %d",&point[i].x,&point[i].y); memset(visit,false,sizeof(visit)); for(int i=1;i<=n;i++) dist[i]=inf; dist[1]=0; for(int i=1;i<=n;i++) { int minn=inf,index; for(int j=1;j<=n;j++) { if(!visit[j]&&dist[j]<minn) { minn=dist[j]; index=j; } } visit[index]=1; for(int j=1;j<=n;j++) { if(!visit[j]&&dist[j]>max(dist[index],Distance(point[j],point[index]))) dist[j]=max(dist[index],Distance(point[j],point[index])); } } printf("Scenario #%d\n",cnt); printf("Frog Distance = %.3f\n\n",dist[2]); } return 0; }
floyed
这里M[i][j]定义是i j两点间最大边的松弛后最小值, M[i][j]=min(M[i][j],max(M[i][k],M[k][j]));。时间复杂度n^3,由于这题只有200个数据,可以用!
[code]#include<cmath> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n; double M[210][210]; const double inf=99999999; struct Point { int x,y; }point[210]; double Distance(Point a,Point b) { return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } void floyd() { for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) M[i][j]=min(M[i][j],max(M[i][k],M[k][j])); } int main() { int cnt=0; while(~scanf("%d",&n)&&n) { cnt++; for(int i=1;i<=n;i++) scanf("%d %d",&point[i].x,&point[i].y); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) M[i][j]=(double)Distance(point[i],point[j]); floyd(); printf("Scenario #%d\n",cnt); printf("Frog Distance = %.3f\n\n",M[1][2]); } return 0; }
最小生成树
构建一个最小生成树,输出最大值!bingo
[code]#include<cmath> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n,m; double dist[210],ans; bool visit[210]; const double inf=99999999; struct Point { int x,y; }point[210]; double Distance(Point a,Point b) { return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } void prime() { ans=0; memset(visit,0,sizeof(visit)); for(int i=1;i<=n;i++) dist[i]=Distance(point[1],point[i]); visit[1]=1; for(int i=1;i<=n-1;i++) { double minn=99999999.0;int index; for(int j=1;j<=n;j++) { if(!visit[j]&&dist[j]<minn) { index=j; minn=dist[j]; } } visit[index]=1; ans=max(ans,minn); if(index==2)break; for(int j=1;j<=n;j++) { if(!visit[j]&&dist[j]>Distance(point[index],point[j])) dist[j]=Distance(point[index],point[j]); } } } int main() { int cnt=0; while(~scanf("%d",&n)&&n) { cnt++; for(int i=1;i<=n;i++) scanf("%d %d",&point[i].x,&point[i].y); prime(); printf("Scenario #%d\n",cnt); printf("Frog Distance = %.3f\n\n",ans); } return 0; }
相关文章推荐
- SystemVerilog中的$cast()向下类型转换
- Bootstrap 字体图标,下拉列表组件的使用
- Linux下C# 开发环境搭建
- SoftReference+Thread进行图片加载(一)
- GDOI2016模拟8.21总结
- xib文件的应用
- 【Linux系统编程】文件IO操作
- 在JS方法中返回多个值的三种方法
- 装饰器模式 java 414
- 算法:之字形来回打印矩阵
- 零基础学C语言 笔记二 scanf
- [持续更新]JavaScript学习笔记(六)
- 黑马程序员_网络编程学习笔记
- 巴什博奕 bun4068
- Toku的安装使用
- js的Navigator对象
- 【面向代码】学习 Deep Learning(四) Stacked Auto-Encoders(SAE)
- 【面向代码】学习 Deep Learning(三)Convolution Neural Network(CNN)
- poj2002 哈希
- 《head first python》——理解数据:列表排序与集合