洛谷 1260 工程规划 (差分约束)

本文介绍了一种基于不等式的求解算法,通过不断调整变量的最大值和最小值来解决约束问题。该算法适用于一系列关于变量之间的不等式关系,并能够判断是否存在可行解。
/*
Ti≤Tj+b意味Ti的最大值为Tj+b;
Tj≥Ti-b意味Tj的最大值为Ti-b;
因此,根据题中给出的m个不等式,逐步调整各个Ti的最小值和最大值。
设high[i]为Ti当前的最大值,low[i]为Ti当前的最小值。
high[j]为Tj当前的最大值,low[j]为Tj当前的最小值。
若high[i]-high[j]>b,则high[i]=high[j]+b(根据Ti≤Tj+b),
若low[i]-low[j]<b,则low[j]=low[i]-b(根据Ti≥Ti-b)。
直到出现矛盾或者调整不发生变化时停止 
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 5010
using namespace std;
int n,m,l[maxn],r[maxn],x[maxn],y[maxn],z[maxn],can;
void Get_lr()
{
    for(int i=2;i<=n;i++)
      l[i]=-100000,r[i]=100000;//绝对值不够大不行 不是简单地 -100 - 100 
                               //每两个是100 一共1000个 1000*100 
}
int main()
{
    scanf("%d%d",&n,&m);
    Get_lr();
    for(int i=1;i<=m;i++)
      scanf("%d%d%d",&x[i],&y[i],&z[i]);
    while(1)
      {
          int falg=0,f=0;
          for(int i=1;i<=m;i++)
            {
                if(r[x[i]]>r[y[i]]+z[i])
              r[x[i]]=r[y[i]]+z[i],f++;
                if(l[y[i]]<l[x[i]]-z[i])
              l[y[i]]=l[x[i]]-z[i],f++;
          }
        for(int i=1;i<=n;i++)
          if(l[i]>r[i])
            {
              falg=1;break;
            }
        if(falg)break;
        if(f==0)
          {
              can=1;break;
          }
      }
    if(!can)
      {
          printf("NO SOLUTION\n");
          return 0;
      }
    int cd=0x3f3f3f3f;
    for(int i=1;i<=n;i++)cd=min(cd,l[i]);//调整结果 恰好有零 
    for(int i=1;i<=n;i++)printf("%d\n",l[i]-cd);
    return 0;
}

 

转载于:https://www.cnblogs.com/yanlifneg/p/5596929.html

### 关于差分算法及其应用 差分是一种常见的计算方法,在处理区间操作时非常高效。通过差分,可以在 \(O(1)\) 时间内完成对区间的修改,并在后续一次性求得整个序列的结果[^1]。 #### 差分的基本原理 假设有一个长度为 \(n\) 的数组 \(a[]\),其对应的差分数组定义如下: \[ \text{diff}[i] = a[i] - a[i-1], (1 \leq i < n), \quad \text{diff}[0] = a[0]. \] 当需要对原数组的一个区间 \([l, r]\) 进行增加某个值的操作时,仅需调整差分数组中的两项即可实现目标效果: ```python def update_diff(diff, l, r, value): diff[l] += value if r + 1 < len(diff): # 如果r不是最后一个位置,则减少下一个位置的值 diff[r + 1] -= value ``` 最终还原原始数组的过程是对差分数组进行累加运算: ```python def restore_array(diff): result = [] current_sum = 0 for val in diff: current_sum += val result.append(current_sum) return result ``` #### 结合前缀和的应用场景 有时为了更方便地解决某些特定问题,会先利用前缀和简化查询过程再引入差分技术来加速更新效率[^3]。比如在一个动态规划或者贪心策略里可能涉及到频繁读取某一段范围内的总和以及对该范围内数值做统一改变的情况。 #### 实际案例分析——洛谷P3998单链表解法启示录 虽然此题主要讨论的是基于指针结构的数据存储形式而非纯粹意义上的差分类型题目[^4],但从另一个角度来看待这个问题的话也可以联想到类似的思想模式:即如何有效地追踪节点间的关系并快速定位所需信息点位。这启发我们在面对其他类型的挑战时也要善于发掘隐藏其中的核心逻辑关系。 ### 示例代码展示 下面给出一个简单的Python程序片段用于演示基本概念: ```python # 初始化数组与对应差分数组 original = [1, 2, 3, 4, 5] difference = original.copy() for i in range(len(original)-1, 0, -1): difference[i] -= original[i-1] print("Original Array:", original) print("Difference Array:", difference) # 执行一次区间更新[L,R]+X L, R, X = 1, 3, 2 update_diff(difference, L, R, X) restored = restore_array(difference) print("Updated Original Array via Difference:", restored) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值