BIT 1024 载重问题

本文介绍了一个利用 Dijkstra 算法解决城市平面图问题的方法,即从起始点李凌所在地到客户所在地 n 的道路上找到最大承重能力的路径。通过伟神的博客作为参考,文章详细阐述了解题过程,包括如何正确扩展节点以优化路径选择。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意:城市的平面图已给定, n 个路口标号为 1 n ,路口之间的每条街道都标有承重限制。任务是找出从路口 1 (李凌所在地)到路口 n (客户所在地)的道路上的最大承重能力。假定至少存在一条这样的道路。每条街道都可以双向行驶。

 

考察点:dijkstra

 

思路分析:一开始就想到了dijkstra,但是一直写不好,主要是扩展节点的时候不知道该怎么扩展。后来参考了伟神的博客http://blog.youkuaiyun.com/zhangwei1120112119/article/details/8553691,每次扩展的时候扩展载重最大的那个就行了。

 

 

#include<stdio.h>
#include<stdbool.h>
#define max(x,y) (x)>(y)? (x):(y)
int t;
int a[1001][1001];
int f[1001];
bool flag[1001];

int main()
{
    int n,m,i,j,k,p,c,s;
    scanf("%d",&t);
    for (p=1;p<=t;p++)
    {
      scanf("%d%d",&n,&m);
      memset(a,0,sizeof(a));
      memset(flag,false,sizeof(flag));
      memset(f,0,sizeof(f));
      for (i=1;i<=m;i++)
        {
          scanf("%d%d%d",&j,&k,&c);
          a[j][k]=max(a[j][k],c);a[k][j]=a[j][k];
        }
      f[1]=5000000;
      while (2>1) 
      {
            s=-1;
            for (i=1;i<=n;i++)
              if (flag[i]==false)
                {
                  if ((s==-1)||(f[i]>f[s]))
                    s=i;
                }
            if (s==-1) break;
            flag[s]=true;
            for (i=1;i<=n;i++)
            {
                if (f[s]<a[s][i]) 
                  {
                    if (f[s]>f[i])
                      f[i]=f[s];
                  }
                 else {
                      if (a[s][i]>f[i])
                        f[i]=a[s][i];
                      }
            }
      } 
      printf("City #%d:\n",p);
      printf("%d\n\n",f[n]);
    }
    return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值