POJ 1797 最短路变形所有路径最小边的最大值

本文介绍了一种使用迪杰斯特拉算法解决寻找路径中最大承重问题的方法,通过修改传统迪杰斯特拉算法的路径更新步骤,实现了求解所有路径中最小边的最大值,适用于卡车承重路线规划等场景。

题意:卡车从路上经过,给出顶点 n , 边数 m,然后是a点到b点的权值w(a到b路段的承重),求卡车最重的重量是多少可以从上面经过。

思路:求所有路径中的最小的边的最大值。可以用迪杰斯特拉算法,只需要将模板的路径更新那改一下,具体看代码注释。

注意:数组的初始化为-1或零m因为题意说的权值并不是距离,而是路的承重。

代码如下:

#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
int e[1010][1010],inf=0x3f3f3f3f,n,dis[1010],book[1010];
void djstl(int x)
{
    for(int i=1; i<=n; i++)
        dis[i]=e[1][i];
    memset(book,0,sizeof(book));
    book[x]=1;
    for(int i=1; i<=n-1; i++)
    {
        int maxx=-1,u;
        for(int j=1; j<=n; j++)
        {
            if(dis[j]>maxx&&!book[j])
            {
                u=j;
                maxx=dis[j];
            }
        }
        book[u]=1;//找到最短的边
        for(int v=1; v<=n; v++)
        {
            if(dis[v]<min(dis[u],e[u][v]))//每条路径最小的权值 最大的数值
                dis[v]=min(dis[u],e[u][v]);//并不是一下子找到,可以分解成三个点的子图 不断优化 
        }
    }
}
int main()
{
    int m,t,z=1;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&m);
        for(int i=0; i<=1001; i++)
            for(int j=0; j<=1001; j++)
                if(i==j)
                    e[i][j]=0;
                else
                    e[i][j]=-1;//初始化为-1,不通
        int t1,t2,t3;
        for(int i=0; i<m; i++)
        {
            scanf("%d%d%d",&t1,&t2,&t3);
            if(e[t1][t2]<t3)//注意
                e[t1][t2]=e[t2][t1]=t3;
        }
        djstl(1);
        printf("Scenario #%d:\n",z++);
        printf("%d\n\n",dis[n]);
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值