美文网首页GraphTheory
最短路径(路径中的最值问题)

最短路径(路径中的最值问题)

作者: 雨落八千里 | 来源:发表于2019-07-20 19:33 被阅读2次

Frogger最短路径中的最大边的最小值是多少?

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define INF 0x3f3f3f
using namespace std;
double dis[1100];
int vis[1100];
double x[1100],y[1100];
double mp[1100][1100];
int n;
void dijst(int x)
{
    memset(vis,0,sizeof(vis));
    int v;
    vis[x]=1;
    for(int i=1;i<=n;i++)
    {
        dis[i]=mp[x][i];//dis存储的是第i个点到第1个点的距离中的最大距离的最小值
        //printf("%.3lf ",dis[i]);
    }
    //printf("\n");
    while(true)
    {
        v=-1;
        for(int i=1;i<=n;i++)
        {
            if(!vis[i]&&(v==-1||dis[v]>dis[i]))//找出最小的边
            {
                v=i;
            }
        }
        if(v==-1)
        {
            break;
        }
        vis[v]=1;
        for(int i=1;i<=n;i++)
        {
            dis[i]=min(dis[i],max(dis[v],mp[v][i]));//更新第i个点到第1个点的最大距离最小值(直达与转车的比较)
            //printf("%.3lf ",dis[i]);
        }
        //printf("\n");
    }
}
int main( )
{
    int t=0;
    while(~scanf("%d",&n)&&n)
    {
        memset(mp,INF,sizeof(mp));
        memset(dis,INF,sizeof(dis));
        t++;
        for(int i=1;i<=n;i++)
        {
            scanf("%lf%lf",&x[i],&y[i]);
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                mp[i][j]=mp[j][i]=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
                //mp存储的的第i个点到第j个点的距离
            }
        }
        // for(int i=1;i<=n;i++)
        // {
        //     for(int j=1;j<=n;j++)
        //     {
        //         printf("%.3lf ",mp[i][j]);
        //     }
        //     cout<<endl;
        // }
        // cout<<endl;
        dijst(1);
        printf("Scenario #%d\nFrog Distance = %.3f\n\n",t,dis[2]);
    }
    return 0;
}

Heavy Transportation最短路径中最小边的最大值可以是多少

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define INF 0x3f3f3f3f
using namespace std;
const int M=1100;
int mp[M][M];
int vis[M];
int dis[M];
int n,m;
void dijst(int x)
{
    memset(vis,0,sizeof(vis));
    int v;
    vis[x]=1;
    for(int i=1;i<=n;i++)
    {
        dis[i]=mp[x][i];//dis储存的是第i个点到第1个点的距离中最小距离的最大值
    }
    while(true)
    {
        v=-1;
        for(int i=1;i<=n;i++)
        {
            if(!vis[i]&&(v==-1||dis[v]<dis[i]))//找出最大边
            {
                v=i;
            }
        }
        if(v==-1)
        {
            break;
        }
        vis[v]=1;
        for(int i=1;i<=n;i++)
        {
            dis[i]=max(dis[i],min(dis[v],mp[v][i]));
            //更新第i个点到第1个点的距离中的最小距离的最大值
        }
    }
}
int main( )
{
    int t,k=0,x,y,w;
    scanf("%d",&t);
    while(t--)
    {
        k++;
        memset(mp,-1,sizeof(mp));
        memset(dis,-1,sizeof(dis));
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d%d",&x,&y,&w);
            mp[x][y]=mp[y][x]=w;
        }
        dijst(1);
        printf("Scenario #%d:\n%d\n\n",k,dis[n]);
    }
    return 0;
}

相关文章

网友评论

    本文标题:最短路径(路径中的最值问题)

    本文链接:https://www.haomeiwen.com/subject/genulctx.html