POJ-2253-Frogger +最短路小变形

Posted ckxkexing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ-2253-Frogger +最短路小变形相关的知识,希望对你有一定的参考价值。

传送门:http://poj.org/problem?id=2253

参考:https://www.cnblogs.com/lienus/p/4273159.html

题意:给出一个无向图,求一条从 1 到 2 的路径,使得路径上的最大边权最小;

思路:

dij将距离更新改成取最大值即可,即dis[i]表示到达i点过程中的最大边权,更新后可能多个,再靠优先队列取出最小的最大边权。

#include <iostream>
#include <queue>
#include <cstdio>
#include <vector>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define pb push_back
#define fi first
#define se second
typedef long long ll;

const ll INF = 1e9+9 ;
const int maxn  = 1006 ;

ll n, m, k, s;
double dis[maxn];
bool vis[maxn];
vector < pair<ll, double > > mp[maxn];
priority_queue< pair<double ,ll > > q;

struct node {
    int x,y;
}ac[300];
double omyway(int i,int j)
{
    node a = ac[i],b = ac[j];
    return sqrt( 1.0*(a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y) );
}
void dij(){
    memset(vis,0,sizeof(vis));
    while(!q.empty())
    {
            int v = q.top().se;
            q.pop();
            if(vis[v])continue;
            vis[v] = 1;
            for(int i=0;i<mp[v].size();i++)
            {
                int tmp = mp[v][i].fi;
                double tmpc = mp[v][i].se;
                if(dis[tmp] > max(dis[v],tmpc))
                {
                    dis[tmp] = max(dis[v] , tmpc);
                    q.push(make_pair(-1.0*dis[tmp],tmp));
                }
            }
    }
}
int main(){
    int cnt = 1;
    while(~scanf("%lld", &n) && n)
    {

        for(int i = 0; i < maxn; i ++)
            mp[i].clear(), dis[i]=INF;

        for(int i=1; i<=n; i++)
        {
           int x,y;
           scanf("%d%d",&x,&y);
           ac[i].x=x;
           ac[i].y=y;
        }

        for(int i=1;i<=n;i++)
        {
            for(int j=i+1;j<=n;j++)
            {
                double tmp = omyway(i,j);
                mp[i].push_back(make_pair(j,tmp));
                mp[j].push_back(make_pair(i,tmp));
            }
        }

        dis[1] = 0.0;
        q.push(make_pair(0.0,1));
        dij();
        printf("Scenario #%d\\n",cnt++);
        printf("Frog Distance = %.3f\\n\\n",dis[2]);
    }
    return 0;
}

 

以上是关于POJ-2253-Frogger +最短路小变形的主要内容,如果未能解决你的问题,请参考以下文章

POJ-2253-Frogger(最短路变形)

POJ 2253 Frogger(Dijkstra变形——最短路径最小权值)

[ACM] POJ 2253 Frogger (最短路径变形,每条通路中的最长边的最小值)

POJ-2253 Frogger---最短路变形&&最大边的最小值

POJ-2253 Frogger(最短路)

POJ 2253 Frogger最短路变形/kruskal/A到B多条路径中的最小的最长边