Poj2253 dijkstra最短路变形

题意:求1点到2点的所有能够到2点的所有通路里的的最大路径(这里的路径特指两点之间的线段)的最小值。

这题对我来说收获颇丰,我们可以修改dijkstra里面的松弛函数,使得其变为求每个点的满足条件的值,并用dist数组来记录。详见代码。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
#define INF 0x3f3f3f3f
#define INF2 -0x3f3f3f3f
typedef struct Node
{
    double x;
    double y;
};
Node nodes[205*2];
typedef struct Egde
{
    int l;
    int r;
    double value;
};
double a[205*2][205*2];
double dist[205*2];
bool visited[205*2];
int n,sx,sy,ex,ey;
double Max;
void dijkstra()
{

    visited[1]=true;
    for(int i=1; i<=n; i++)
    {
        dist[i]=a[1][i];
    }
    for(int i=1; i<=n; i++)
    {
         int Min=INF,node=0;
        for(int j=1; j<=n; j++)
        {
            if(!visited[j]&&Min>dist[j])
            {
                Min=dist[j];
                node=j;
            }
        }
        if(node==0)
            return;
        visited[node]=true;


        for(int j=1; j<=n; j++)
        {

            Max=max(dist[node],a[node][j]);//构成dist[node]和a[node][j]里找最大的边,因为这两条边来构成一条新的dist[j]
            //用为要去最大边里的最小边,那么我们就要把它和原来的dist[j]进行比较
            //再把较小的边赋给dist[j]来成为新的dist[j]以便进行下次更新            dist[j]=min(dist[j],Max);
            dist[j]=min(dist[j],Max);
        }
    }


}
int main()
{
    int sym=0;
    while(scanf("%d",&n)&&n!=0)
    {
        sym++;
        memset(nodes,0,sizeof(nodes));
        memset(a,0x3f,sizeof(a));
        memset(dist,0x3f,sizeof(dist));
        memset(visited,false,sizeof(visited));
        for(int i=1; i<=n; i++)
        {
            scanf("%lf%lf",&nodes[i].x,&nodes[i].y);
        }
        for(int i=1; i<=n; i++)
        {
            for(int j=i+1; j<=n; j++)
            {
                double d=sqrt((nodes[i].x-nodes[j].x)*(nodes[i].x-nodes[j].x)+(nodes[i].y-nodes[j].y)*(nodes[i].y-nodes[j].y));
                a[i][j]=a[j][i]=d;
                a[i][i]=0;
            }
        }

        Max=INF;
        dijkstra();
        printf("Scenario #%d\n",sym);
        printf("Frog Distance = %.3f\n\n",dist[2]);
    }


    return 0;

}


 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值