美文网首页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