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 最短路变形('最长路'求'最短路','最短路'求'最长路')的更多相关文章

  1. POJ 2253 Frogger ( 最短路变形 || 最小生成树 )

    题意 : 给出二维平面上 N 个点,前两个点为起点和终点,问你从起点到终点的所有路径中拥有最短两点间距是多少. 分析 : ① 考虑最小生成树中 Kruskal 算法,在建树的过程中贪心的从最小的边一个 ...

  2. hdu 6201 transaction (最短路变形——带负权最长路)

    题意: 给定n个城市的货物买卖价格, 然后给定n-1条道路,每条路有不同的路费, 求出从某两个城市买卖一次的最大利润. 利润 = 卖价 - (买价 + 路费) 样例数据, 最近是从第一个点买入, 第4 ...

  3. POJ-2253.Frogger.(求每条路径中最大值的最小值,最短路变形)

    做到了这个题,感觉网上的博客是真的水,只有kuangbin大神一句话就点醒了我,所以我写这篇博客是为了让最短路的入门者尽快脱坑...... 本题思路:本题是最短路的变形,要求出最短路中的最大跳跃距离, ...

  4. HN0I2000最优乘车 (最短路变形)

    HN0I2000最优乘车 (最短路变形) 版权声明:本篇随笔版权归作者YJSheep(www.cnblogs.com/yangyaojia)所有,转载请保留原地址! [试题]为了简化城市公共汽车收费系 ...

  5. POJ-1797Heavy Transportation,最短路变形,用dijkstra稍加修改就可以了;

    Heavy Transportation Time Limit: 3000MS   Memory Limit: 30000K          Description Background  Hugo ...

  6. HDOJ find the safest road 1596【最短路变形】

    find the safest road Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  7. Heavy Transportation POJ 1797 最短路变形

    Heavy Transportation POJ 1797 最短路变形 题意 原题链接 题意大体就是说在一个地图上,有n个城市,编号从1 2 3 ... n,m条路,每条路都有相应的承重能力,然后让你 ...

  8. POJ 3635 - Full Tank? - [最短路变形][手写二叉堆优化Dijkstra][配对堆优化Dijkstra]

    题目链接:http://poj.org/problem?id=3635 题意题解等均参考:POJ 3635 - Full Tank? - [最短路变形][优先队列优化Dijkstra]. 一些口胡: ...

  9. POJ 3635 - Full Tank? - [最短路变形][优先队列优化Dijkstra]

    题目链接:http://poj.org/problem?id=3635 Description After going through the receipts from your car trip ...

  10. hdu 1595(最短路变形好题)

    find the longest of the shortest Time Limit: 1000/5000 MS (Java/Others)    Memory Limit: 32768/32768 ...

随机推荐

  1. 百度/头条合作命中注定!中国新BAT要来了

    据外媒报道,今日头条母公司字节跳动(ByteDace)将为中国互联网传统BAT的格局,带来一些新的活力.这家增速飞快的新闻.视频App“制造者”已经估值高达750亿美元,与三巨头之一的百度平起平坐,后 ...

  2. BZOJ1022[SHOI2008]小约翰的游戏——anti-SG(反尼姆博弈)

    题目描述 小约翰经常和他的哥哥玩一个非常有趣的游戏:桌子上有n堆石子,小约翰和他的哥哥轮流取石子,每个人取的时候,可以随意选择一堆石子,在这堆石子中取走任意多的石子,但不能一粒石子也不取,我们规定取到 ...

  3. MVC DropDownList

    最近发现一个 MVC中绑定前台DropDownList , 并且设置默认选中项的简单方法. 直接上代码 方案一 Action:  ViewData["goodsTypeList"] ...

  4. Qtree3题解(树链剖分+线段树+set)

    外话:最近洛谷加了好多好题啊...原题入口 这题好像是SPOJ的题,挺不错的.看没有题解还是来一篇... 题意 很易懂吧.. 题解 我的做法十分的暴力:树链剖分(伪)+线段树+ std :: set ...

  5. Leetcode 414.Fizz Buzz By Python

    写一个程序,输出从 1 到 n 数字的字符串表示. 如果 n 是3的倍数,输出"Fizz": 如果 n 是5的倍数,输出"Buzz": 3.如果 n 同时是3和 ...

  6. SharePoint 2013 APP 开发示例 系列

    SharePoint 2013 APP 安全: SharePoint 2013 APP 开发示例 (一)List 读写 SharePoint 2013 APP 开发示例 (二)获取用户信息 Share ...

  7. 洛谷 P1691 有重复元素的排列问题 解题报告

    P1691 有重复元素的排列问题 题目描述 设\(R={r_1,r_2,--,r_n}\)是要进行排列的\(n\)个元素.其中元素\(r_1,r_2,--,r_n\)可能相同.使设计一个算法,列出\( ...

  8. Elasticsearch中使用groovy脚本处理boolean字段的一个问题

    Elasticsearch中使用groovy脚本获取文档的bool字段值时,得到的值是字符的 'T' 或者 'F' ,而不是bool值 true 和 false . 比如文档中有一个字段是 { &qu ...

  9. SpaceVim的基本安装和常见问题

    SpaceVim官网:https://spacevim.org/ SpaceVim中文官网:http://spacevim.org/cn/ SpaceVim的Github页面:https://gith ...

  10. MSSQL 转 ACCESS 在表格结构上应注意的

    今天在把一个MSSQL数据库转为ACCESS发现了一些问题: 在MSSQL表格中的一个(标识)递增字段转到ACCESS后,变成了 “数字”类型,而不是“自动编号”. 而当在Access中,一个字段类型 ...