news 2026/10/14 8:30:30

P1260 工程规划【洛谷算法习题】

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
P1260 工程规划【洛谷算法习题】

P1260 工程规划

网页链接

P1260 工程规划

题目描述

造一幢大楼是一项艰巨的工程,它是由n nn个子任务构成的,给它们分别编号1 , 2 , ⋯ , n ( 5 ≤ n ≤ 1000 ) 1,2,\cdots,n\ (5≤n≤1000)1,2,⋯,n(5≤n≤1000)。由于对一些任务的起始条件有着严格的限制,所以每个任务的起始时间T 1 , T 2 , ⋯ , T n T_1,T_2,\cdots,T_nT1​,T2​,⋯,Tn​并不是很容易确定的(但这些起始时间都是非负整数,因为它们必须在整个工程开始后启动)。例如:挖掘完成后,紧接着就要打地基;但是混凝土浇筑完成后,却要等待一段时间再去掉模板。

这种要求就可以用m ( 5 ≤ m ≤ 5000 ) m\ (5≤m≤5000)m(5≤m≤5000)个不等式表示,不等式形如T i − T j ≤ b T_i-T_j≤bTi​−Tj​≤b代表i ii和j jj的起始时间必须满足的条件。每个不等式的右边都是一个常数b bb,这些常数可能不相同,但是它们都在区间( − 100 , 100 ) (-100,100)(−100,100)内。

你的任务就是写一个程序,给定像上面那样的不等式,找出一种可能的起始时间序列T 1 , T 2 , ⋯ , T n T_1,T_2,\cdots,T_nT1​,T2​,⋯,Tn​,或者判断问题无解。对于有解的情况,要使最早进行的那个任务和整个工程的起始时间相同,也就是说,T 1 , T 2 , ⋯ , T n T_1,T_2,\cdots,T_nT1​,T2​,⋯,Tn​中至少有一个为0 00。

输入格式

第一行是用空格隔开的两个正整数n nn和m mm,下面的m mm行每行有三个用空格隔开的整数i , j , b i,j,bi,j,b对应着不等式T i − T j ≤ b T_i-T_j≤bTi​−Tj​≤b。

输出格式

如果有可行的方案,那么输出n nn行,每行都有一个非负整数且至少有一个为0 00,按顺序表示每个任务的起始时间。如果没有可行的方案,就输出信息NO SOLUTION。

输入输出样例 #1

输入 #1

5 8 1 2 0 1 5 -1 2 5 1 3 1 5 4 1 4 4 3 -1 5 3 -1 5 4 -3

输出 #1

0 2 5 4 1

输入输出样例 #2

输入 #2

5 5 1 2 -3 1 5 -1 2 5 -1 5 1 -5 4 1 4

输出 #2

NO SOLUTION

说明/提示

由@zhouyonglong提供SPJ

解题思路

本题是差分约束系统的经典应用。给定n nn个变量T 1 , T 2 , … , T n T_1, T_2, \dots, T_nT1​,T2​,…,Tn​,以及m mm个不等式T i − T j ≤ b T_i - T_j \le bTi​−Tj​≤b,要求找出一组非负整数解,且至少有一个变量为0 00。若不存在这样的解,则输出NO SOLUTION。

1. 问题等价转化
  • 不等式T i − T j ≤ b T_i - T_j \le bTi​−Tj​≤b可以变形为T i ≤ T j + b T_i \le T_j + bTi​≤Tj​+b。这恰好对应图中一条从节点j jj指向节点i ii的有向边,边权为b bb。
  • 因此,整个不等式组构成一个有向图。求解T TT的值等价于在这个图中求最短路径:对于任意一条边j → i j \to ij→i(权值b bb),必须满足T i ≤ T j + b T_i \le T_j + bTi​≤Tj​+b,即T i T_iTi​不超过T j + b T_j + bTj​+b。这正好是三角不等式。
  • 如果图中存在负环,则意味着存在矛盾(例如T i ≤ T i + 负数 T_i \le T_i + \text{负数}Ti​≤Ti​+负数),此时无解。
  • 由于题目要求T i T_iTi​非负且至少有一个为0 00,我们可以先忽略非负约束,求得任意一组满足不等式的解(可能包含负数),然后找到所有解中的最小值min_val,将每个T i T_iTi​减去min_val,即可得到一组非负解,且最小值为0 00。
2. 算法实现(SPFA 求最短路径)

代码使用SPFA(队列优化的 Bellman-Ford)算法来检测负环并求最短路径。

  • 建图:读入m mm个不等式,对于每个T i − T j ≤ b T_i - T_j \le bTi​−Tj​≤b,建立一条从j jj到i ii的有向边,权值为b bb。
  • 初始化:由于图可能不连通,需要对每个未访问的节点分别作为起点进行 SPFA。将起点的距离设为0 00,并加入队列。
  • SPFA 过程:
    • 从队列中取出节点now,遍历其所有出边。
    • 若dis[to] > dis[now] + w,则更新dis[to],并将to入队。
    • 使用cnt[now]记录节点入队次数。若某个节点入队次数超过n * n(代码中使用的宽松阈值),则认为存在负环,输出NO SOLUTION并结束。
  • 结果处理:
    • 所有节点处理完毕后,dis[i]即为满足不等式组的一组解(可能有负值)。
    • 找出dis[1..n]中的最小值sm。
    • 输出dis[i] - sm,这样所有值都非负,且至少有一个为0 00。
3. 复杂度分析
  • 时间复杂度:SPFA 的平均时间复杂度为O ( k m ) O(km)O(km),其中k kk为常数,最坏情况为O ( n m ) O(nm)O(nm)。本题n ≤ 1000 n \le 1000n≤1000,m ≤ 5000 m \le 5000m≤5000,运算量在可接受范围内。
  • 空间复杂度:邻接表存储图需要O ( n + m ) O(n + m)O(n+m),距离、入队标记等数组需要O ( n ) O(n)O(n),总空间O ( n + m ) O(n + m)O(n+m),满足 256M 限制。

总结

将不等式组转化为有向图,利用 SPFA 求最短路径并检测负环。若存在负环则无解;否则得到一组解,再通过整体平移使所有值非负且最小值为0 00。该方法巧妙地将差分约束问题转化为图论最短路问题,是解决此类问题的标准套路。

代码内容

#include<bits/stdc++.h>usingnamespacestd;#defineendl'\n'typedeflonglongll;typedefunsignedlonglongull;typedefvector<vector<ll>>vvt;typedefpair<ll,ll>pll;constll N=1e5;constll INF=1e9;constll M=1e6+10;constll mod=1e9+7;ll inq[N],dis[N],cnt[N];vector<pll>G[N];queue<ll>Q;intmain(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);ll n,p,u,v,w;cin>>n>>p;for(ll i=1;i<=p;i++){cin>>u>>v>>w;G[v].push_back({u,w});}for(ll i=1;i<=n;i++)dis[i]=INF;for(ll r=1;r<=n;r++){if(dis[r]!=INF)continue;dis[r]=0;inq[r]=1;Q.push(r);while(!Q.empty()){ll now=Q.front();inq[now]=0;Q.pop();cnt[now]++;if(cnt[now]>=n*n){puts("NO SOLUTION");return0;}for(ll i=0;i<(ll)G[now].size();i++){if(dis[G[now][i].first]>dis[now]+G[now][i].second){dis[G[now][i].first]=dis[now]+G[now][i].second;Q.push(G[now][i].first);inq[G[now][i].first]=1;}}}}ll sm=0;for(ll i=1;i<=n;i++)sm=min(sm,dis[i]);for(ll i=1;i<=n;i++)cout<<dis[i]-sm<<' ';return0;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/14 8:30:29

Res2dmod二维正演实战:从源码编译到地质模型构建

简介&#xff1a;本资源为地球物理勘探领域专业正演软件Res2dmod的完整安装包&#xff0c;面向地质勘查、矿产与石油勘探、环境及工程地质等方向的科研人员与高年级本科生/研究生&#xff0c;用于开展二维高密度电法正演模拟与反演建模。包内共5个文件&#xff1a;setup.exe与s…

作者头像 李华
网站建设 2026/10/14 8:30:29

SpringBoot+Vue+MyBatis构建智慧党建系统实践

1. 智慧党建系统架构解析 在企业级应用开发领域&#xff0c;智慧党建系统采用SpringBootVueMyBatis的技术组合堪称经典搭配。这套架构方案在保证系统稳定性的同时&#xff0c;兼顾了开发效率和扩展性需求。我在实际项目中发现&#xff0c;这种前后端分离的架构模式特别适合需要…

作者头像 李华
网站建设 2026/10/14 8:30:24

警惕Vibe Coding陷阱:程序员职业发展的隐形杀手

1. 警惕Vibe Coding陷阱&#xff1a;程序员职业生涯的隐形杀手 最近在技术社区里&#xff0c;一个叫做"Vibe Coding"的概念开始流行起来。作为从业十年的老码农&#xff0c;我必须提醒各位同行&#xff1a;这种看似轻松愉快的编码方式&#xff0c;实际上正在悄悄毁掉…

作者头像 李华
网站建设 2026/10/14 8:30:17

LiteLLM实践:统一大模型API网关,解决多模型接入与成本管控难题

你有没有遇到过这种情况&#xff1a;项目里的模型调用越来越散&#xff0c;这家厂商一种接口格式&#xff0c;那家又是另一套鉴权方式&#xff0c;本地部署的模型还要单独写一套请求逻辑&#xff0c;业务代码里塞满了厂商分支。我在某个内部项目里就踩过这个坑&#xff0c;后面…

作者头像 李华
网站建设 2026/10/14 8:30:14

中美AQI标准转换算法与Python实现

1. 空气质量指数&#xff08;AQI&#xff09;基础概念解析 空气质量指数&#xff08;Air Quality Index&#xff0c;简称AQI&#xff09;是衡量空气污染程度的重要指标&#xff0c;它通过将多种主要污染物的浓度转化为单一数值&#xff0c;使公众能够快速了解当前空气质量状况。…

作者头像 李华
网站建设 2026/10/14 8:29:59

大a投资特性解析:高流动性、杠杆效应与政策关联

1. 视频内容概述"神奇的大a&#xff08;上&#xff09;"这期视频主要探讨了当前市场环境下一个备受关注的投资标的——我们暂且称之为"大a"的特殊表现。作为系列内容的第八集&#xff0c;本期聚焦于大a的基本特性、历史表现和近期市场反应&#xff0c;为下…

作者头像 李华