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;
}


 

### 成像卫星单星任务规划算法的IT实现方案设计 #### 1. 整数规划模型的应用 成像卫星的任务规划可以被建模为整数规划问题。通过定义决策变量来表示不同观测请求的选择情况,以及引入一系列线性不等式作为约束条件,能够有效地描述实际操作中的各种限制因素,比如传感器的工作模式切换时间和最大连续工作时长等[^1]。 对于具体的编程实践来说,在Python环境中可借助`PuLP`库构建此类优化模型: ```python from pulp import * prob = LpProblem("Satellite_Task_Planning", LpMaximize) # 定义决策变量 requests = ['req_1', 'req_2', ... , 'req_n'] decision_vars = LpVariable.dicts('RequestSelection', requests, cat='Binary') # 添加目标函数 objective_function = lpSum([value * decision_vars[request] for request, value in zip(requests, values)]) prob += objective_function # 加入约束条件... for constraint in constraints: prob.addConstraint(constraint) status = prob.solve() print(f'Status: {LpStatus[status]}') ``` 此段代码展示了如何创建一个简单的最大化收益型整数规划问题实例,并调用了求解器尝试找到最优解集。 #### 2. 背包问题视角下的方法论 当考虑带有时间窗口特性的多目标场景下,可以把该类问题视为一种特殊的0/1背包问题变体——即每个物品不仅具有重量属性还附带了一个有效访问区间。此时的目标是在不超过载重上限的前提下尽可能多地装载价值较高的项目(对应于高优先级或重要程度更高的图像采集指令)。这种思路同样适用于SPOT系列遥感平台的日程安排过程之中。 利用动态规划的思想编写相应程序片段如下所示: ```python def knapsack_with_time_windows(items, capacity): n = len(items) dp = [[0]*(capacity+1) for _ in range(n+1)] for i in range(1,n+1): item_weight, item_value, start_time, end_time = items[i-1] for w in reversed(range(capacity + 1)): if w >= item_weight and (start_time <= current_time <= end_time): dp[i][w] = max(dp[i-1][w], dp[i-1][w-item_weight]+item_value) else: dp[i][w]=dp[i-1][w] return dp[-1][-1] ``` 上述伪码实现了基于二维数组存储状态转移方程的结果矩阵版本;其中current_time需由外部提供给定时刻信息用于判断当前是否处于允许执行的时间范围内。 #### 3. 约束满足问题框架内的解决方案 另一种常见的处理方式就是采用CSP(Constraints Satisfaction Problem)形式表述整个流程逻辑关系网路结构。在此基础上运用启发式搜索算法逐步缩小可行域直至最终定位到满意答案为止。GREAS系统正是采用了类似的架构并成功应用于商业领域当中。 下面给出一段简化版的模拟退火法寻找近似全局极值点的例子: ```python import random import math class TaskPlanner(object): def __init__(self, tasks): self.tasks = tasks def cost(self, solution): total_cost = sum(task['cost']*(not bool(solution & (1<<i))) for i,task in enumerate(self.tasks)) return total_cost def neighbor(self,solution): idx=random.randint(0,len(self)-1) new_solution=solution^(1<<idx)# flip bit at position `idx` return new_solution def solve(self,T=1e4,alpha=.98,min_T=1e-4): best_sol=current_sol=int(''.join(['1']*len(self)),base=2) while T>min_T: next_sol=self.neighbor(current_sol) deltaE=self.cost(next_sol)-self.cost(best_sol) acceptance_prob=min(math.exp(-deltaE/T),1.) if random.uniform(0.,1.)<acceptance_prob: current_sol=next_sol elif self.cost(next_sol)<self.cost(best_sol): best_sol=next_sol T*=alpha return bin(best_sol)[2:].zfill(len(self)) planner = TaskPlanner(tasks=[{'name':'TaskA','cost':5},...]) result = planner.solve() print(result) ``` 这段脚本展示了一种随机化局部寻优策略的具体编码细节,它能够在一定程度上克服传统穷举枚举所带来的计算复杂度瓶颈效应。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值