B - Frogger 最短路变形('最长路'求'最短路','最短路'求'最长路')
http://poj.org/problem?id=2253
题目大意:
有一只可怜没人爱的小青蛙,打算去找他的女神青蛙姐姐,但是池塘水路不能走,所以只能通过蹦跶的形式到达目的地,问你从小青蛙到青蛙姐姐的路程中,有多条路径,问你 每一条 路径中 最大值 中的最小值。打个比方,假设 1-》5有两条路径,第一条路径的最大值为2 ,第二条路径的最大值为3,那麽结果就是 2,题目真的绕。
思路:基本方法就是spfa算法,只不过和原来的标准模板相比,原来的 path[aim] > max(path[aim],path[from]+weight(from,to));//weight(from,to)代表的是从起点到终点的权值
现在的是path[aim] > max(path[from],weight(from,to));所以说的最短路的一个变形。
代码如下:
#include<iostream>
#include<cstring>
#include<string>
#include<iomanip>
#include<cmath>
#include<algorithm>
#include<vector>
#include<map>
#include<queue>
using namespace std;
# define maxn 200+10
# define inf 0x3f3f3f3f
queue<int >q;
vector<pair<int,double > >wakaka[maxn];
struct node
{
int x,y;
} q1[maxn];
int t;
double path[maxn];
double len(int t1,int t2)
{
double x1=fabs(q1[t1].x-q1[t2].x);
double y1=fabs(q1[t1].y-q1[t2].y);
return sqrt(x1*x1+y1*y1);
}
double spfa()
{
for(int i=1; i<=t; i++)
{
path[i]=inf;
}
path[1]=0;
q.push(1);
while(!q.empty())
{
int top=q.front();
q.pop();
int len=wakaka[top].size();
for(int i=0; i<len; i++)
{
int temp=wakaka[top][i].first;
if(path[temp]>max(path[top],wakaka[top][i].second))//path[top]代表的是从出发点到当前点的起始点的这一段中,每一小段距离中的最大值,wakaka[top][i].second代表的是从当前出发点到他下一个点的距离.。
{
path[temp]=max(path[top],wakaka[top][i].second);//这个就是取最长路径中的最小值的过程。
q.push(temp);
}
}
}
return path[2];
}
int main()
{
int num=1;
while(cin>>t&&t)
{
for(int i=1; i<=t; i++)
{
wakaka[i].clear();
}
while(!q.empty())q.pop();
for(int i=1; i<=t; i++)
{
cin>>q1[i].x>>q1[i].y;
}//输入
for(int i=1; i<=t; i++)
{
for(int j=1; j<=t; j++)
{
if(i==j)continue;//不能自己到自己,如果自己到自己还连着,那就可以认为是个环了,结果肯定不对。
double temp=len(i,j);//求出任意两个点的距离
wakaka[i].push_back(make_pair(j,temp));
}
}
double s=spfa();
cout<<"Scenario #"<<num++<<endl;
cout<<"Frog Distance = "<<fixed<<setprecision(3)<<s<<endl;
cout<<endl;
}
return 0;
}
题目链接:http://poj.org/problem?id=1797
题目大意:从目的地到出发路有多条路径,让你求出在从起点到终点的每条路径上某一段路上的最小权值中的最小值。
代码:
#include<iostream>
#include<cstring>
#include<string>
#include<iomanip>
#include<cmath>
#include<algorithm>
#include<vector>
#include<map>
#include<queue>
using namespace std;
# define maxn 10000
# define inf 0x3f3f3f3f
queue<int >q;
vector<pair<int,int > >wakaka[maxn];
int t;
int n,m;
int vis[maxn];
int path[maxn];
int spfa()
{
memset(vis,0,sizeof(vis));
memset(path,0,sizeof(path));
q.push(1);
vis[1]=1;
path[1]=inf;
while(!q.empty())
{
int top=q.front();
q.pop();
vis[top]=0;
int len=wakaka[top].size();
for(int i=0; i<len; i++)
{
int temp=wakaka[top][i].first;
if(path[temp]<min(path[top],wakaka[top][i].second))
{
path[temp]=min(path[top],wakaka[top][i].second);
if(!vis[temp])
{
vis[temp]=1;
q.push(temp);
}
}
}
}
return path[n];
}
int main()
{
ios::sync_with_stdio(false);
cin>>t;
int num=1;
while(t--)
{
cin>>n>>m;
for(int i=1; i<=n; i++)
{
wakaka[i].clear();
}
while(!q.empty())q.pop();
for(int i=1; i<=m; i++)
{
int u,v,w;
cin>>u>>v>>w;
wakaka[u].push_back(make_pair(v,w));
wakaka[v].push_back(make_pair(u,w));
}
int s=spfa();
cout<<"Scenario #"<<num++<<":"<<endl;
cout<<s<<endl<<endl;
}
return 0;
}
反思:
1,第一个题是用来求每条路径上的最大值中的最小值,第二个题是用来求每条路径上的最小值中的最大值。
所以说,第一个题中,在比较的时候,比较条件是if(path[temp]>max(path[top],wakaka[top][i].second)),因为一开始path[temp]是没有被访问过的,如果将path[temp]都初始化为0,但是path[1]应该初始化为0(因为自身到自身的距离为0),那么这个循环就一直进不去了,所以应该讲path数组都初始化为inf。
而在第二个题中,在比较的时候,比较条件应该是if(path[temp]<min(path[top],wakaka[top][i].second)),同理,如果将path[temp]都初始化为inf,但是注意pah[1]应该初始化为inf,如果inf初始化0的话,整个图中每个点的path都会变成0.那也不会进入循环。
总之,path整体的初始化,path[1]的初始化应该按照在队列中的比较条件而改变。
2,在无向图中,一定要记得建立双向的,因为最短路径的构成,很有可能是和题目给的条件是逆向的。
比如说让你求从起点到终点的最大流量。
1 2 5
2 4 2
3 2 4
1 3 2
3 4 3
,如果是单向的话,1-3-4,最大值为2,而如果是双向的话,在2-3这条路多了反向之后,1-2-3-4,就变成了3。
B - Frogger 最短路变形('最长路'求'最短路','最短路'求'最长路')的更多相关文章
- POJ 2253 Frogger ( 最短路变形 || 最小生成树 )
题意 : 给出二维平面上 N 个点,前两个点为起点和终点,问你从起点到终点的所有路径中拥有最短两点间距是多少. 分析 : ① 考虑最小生成树中 Kruskal 算法,在建树的过程中贪心的从最小的边一个 ...
- hdu 6201 transaction (最短路变形——带负权最长路)
题意: 给定n个城市的货物买卖价格, 然后给定n-1条道路,每条路有不同的路费, 求出从某两个城市买卖一次的最大利润. 利润 = 卖价 - (买价 + 路费) 样例数据, 最近是从第一个点买入, 第4 ...
- POJ-2253.Frogger.(求每条路径中最大值的最小值,最短路变形)
做到了这个题,感觉网上的博客是真的水,只有kuangbin大神一句话就点醒了我,所以我写这篇博客是为了让最短路的入门者尽快脱坑...... 本题思路:本题是最短路的变形,要求出最短路中的最大跳跃距离, ...
- HN0I2000最优乘车 (最短路变形)
HN0I2000最优乘车 (最短路变形) 版权声明:本篇随笔版权归作者YJSheep(www.cnblogs.com/yangyaojia)所有,转载请保留原地址! [试题]为了简化城市公共汽车收费系 ...
- POJ-1797Heavy Transportation,最短路变形,用dijkstra稍加修改就可以了;
Heavy Transportation Time Limit: 3000MS Memory Limit: 30000K Description Background Hugo ...
- HDOJ find the safest road 1596【最短路变形】
find the safest road Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- Heavy Transportation POJ 1797 最短路变形
Heavy Transportation POJ 1797 最短路变形 题意 原题链接 题意大体就是说在一个地图上,有n个城市,编号从1 2 3 ... n,m条路,每条路都有相应的承重能力,然后让你 ...
- POJ 3635 - Full Tank? - [最短路变形][手写二叉堆优化Dijkstra][配对堆优化Dijkstra]
题目链接:http://poj.org/problem?id=3635 题意题解等均参考:POJ 3635 - Full Tank? - [最短路变形][优先队列优化Dijkstra]. 一些口胡: ...
- POJ 3635 - Full Tank? - [最短路变形][优先队列优化Dijkstra]
题目链接:http://poj.org/problem?id=3635 Description After going through the receipts from your car trip ...
- hdu 1595(最短路变形好题)
find the longest of the shortest Time Limit: 1000/5000 MS (Java/Others) Memory Limit: 32768/32768 ...
随机推荐
- maven编译的时候跳过test
方式1:用命令带上参数 mvn install -Dmaven.test.skip=true 方式2:在pom.xml里面配置 <plugin> <groupId>org.ap ...
- BZOJ5010 FJOI2017矩阵填数(容斥原理)
如果只考虑某个子矩阵的话,其最大值为v的方案数显然是vsize-(v-1)size.问题在于处理子矩阵间的交叉情况. 如果两个交叉的子矩阵所要求的最大值不同,可以直接把交叉部分划给所要求的最大值较小的 ...
- 【Linux】MGR部署脚本
脚本没有完善,现在只有上半部分的基础环境搭建 [准备条件] 1.三个节点的防火墙关闭 2.原有mysql卸载删除 3.文件夹名字: mgr 所有的源码包都放在mgr的文件夹下 4.文件位置: /roo ...
- John's trip POJ - 1041(这题数据有点水)
题意: 其实还是一个欧拉回路,但要按字典序走路: 解析: 我真是蠢啊emm... map[i][j]表示由顶点i经街道j会到达的顶点编号 然后枚举j就好了 用栈储存.. 虽然我不是这样写的 #incl ...
- Python函数绘图
最近看数学,发现有时候画个图还真管用,对理解和展示效果都不错.尤其是三维空间和一些复杂函数,相当直观,也有助于解题.本来想用mathlab,下载安装都太费事,杀鸡不用牛刀,Python基本就能实现.下 ...
- 自学Zabbix8.1 Regular expressions 正则表达式
点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 自学Zabbix8.1 Regular expressions 正则表达式 1. 配置 点击Adm ...
- 洛谷 P2515 [HAOI2010]软件安装 解题报告
P2515 [HAOI2010]软件安装 题目描述 现在我们的手头有\(N\)个软件,对于一个软件\(i\),它要占用\(W_i\)的磁盘空间,它的价值为\(V_i\).我们希望从中选择一些软件安装到 ...
- Raspbian首次安装后无法使用SSH链接
使用Putty连接树莓派,出现Network Error:Connection Refused 新版的Raspbian系统默认禁用了SSH. 解决方法:在/boot分区创建名为"ssh&qu ...
- [ZJOI2007]矩阵游戏——非常漂亮的二分图转化
题意: 小 Q 是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏――矩阵游戏.矩阵游戏在一个 N×N 黑白方阵进行(如同国际象棋一般,只是颜色是随意的).每次可以对该矩阵进行两种操作: ...
- 走进JVM【二】理解JVM内存区域
引言 对于C++程序员,内存分配与回收的处理一直是令人头疼的问题.Java由于自身的自动内存管理机制,使得管理内存变得非常轻松,不容易出现内存泄漏,溢出的问题. 不容易不代表不会出现问题,一旦内存泄漏 ...