在一个工程项目中,除了自行开发的源码,还会引入若干二进制包。这些二进制包自身也可能依赖其他二进制包,并且每一条依赖关系都会声明一个版本要求。现在需要实现一个简化模型:对给定的一组依赖关系先做合理性检查,判断是否存在循环依赖;如果合理,再对版本号进行统一处理。
一条依赖关系由三个字段组成:
序号:正整数,用于标识发起依赖的二进制包。依赖包序号:正整数,用于标识被依赖的二进制包。依赖包版本号:正整数,表示对该被依赖包的版本要求。例如,关系 {1,3,11} 表示包 1 依赖包 3 的 11 版本。
模型需要完成两部分工作。
第一部分是循环依赖检测。将所有出现过的包视为节点,每条依赖关系视为一条从 序号 指向 依赖包序号 的有向边。如果这些有向边构成环,则判定该组依赖关系不合理。自己依赖自己也属于循环依赖。该检测只关注依赖方向,版本号不参与。
第二部分是版本号收敛。如果不存在循环依赖,则对依赖关系做版本号规整:当一个被依赖包出现在多条依赖关系中,并且对应了多个不同版本号时,将这些版本号统一为其中的最大值。输出时保持原始输入中依赖关系的先后顺序。
约束条件:
每组依赖关系的条数 n 大于 0 且小于 100;每个依赖包版本号为整数,范围是 1 到 99(含两端)。
输入由两组依赖关系构成,按顺序给出。
第一组:
第一行包含一个整数 n,表示该组依赖关系的条数。
接下来 n 行,每行包含三个以英文逗号分隔的整数,依次为 序号、依赖包序号 和 依赖包版本号。
第二组格式与第一组完全相同。
按输入中两组的先后顺序输出结果。
对于第一组:
false。序号,依赖包序号,规整后版本号。第二组按照相同规则输出。两组结果直接相邻,不加空行或分隔符。
输入
3
1,2,10
2,3,20
3,1,30
2
4,5,11
6,5,12
输出
false
4,5,12
6,5,12
说明
第一组中,依赖关系 1 依赖 2、2 依赖 3、3 依赖 1,首尾相接形成闭环,因此存在循环依赖,输出 false。
第二组中,包 5 被两条关系依赖,对应版本 11 和 12。该组没有循环依赖,因此将包 5 的版本统一为最大值 12,并按原顺序输出 4,5,12 和 6,5,12。
输入
2
1,2,99
3,2,1
1
4,4,50
输出
1,2,99
3,2,99
false
说明
第一组中,1 依赖 2 且要求版本 99,3 依赖 2 且要求版本 1。依赖边没有形成环,因此被依赖包 2 的版本统一为最大值 99,输出 1,2,99 和 3,2,99。
第二组中,只有一条 4 依赖 4 的关系。自己依赖自己构成循环依赖,因此输出 false。
输入
4
1,2,5
2,3,6
4,2,7
3,5,8
4
1,2,10
2,3,20
3,4,30
4,2,40
输出
1,2,7
2,3,6
4,2,7
3,5,8
false
说明
第一组中,依赖方向为 1 依赖 2、2 依赖 3、4 依赖 2、3 依赖 5,没有形成环。被依赖包 2 收到版本 5 和 7,统一为最大值 7;被依赖包 3 的版本 6 和包 5 的版本 8 保持不变。按原顺序输出 1,2,7、2,3,6、4,2,7、3,5,8。
第二组中,依赖关系里存在 2 依赖 3、3 依赖 4、4 依赖 2 的闭环,因此输出 false。
© CodeFun2000 · 使用条款
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册