先核对版本,再按依赖关系做拓扑排序。m 最大只有 100,直接模拟即可。
>=、<=,再匹配 >、<,否则 >= 会被拆成 >。-1。1 且出边指向自己的环。0 的最小编号,得到数字序最小的安装顺序。装不完就输出 -2。请实现一个软件包依赖分析系统,用来检查版本是否兼容,并给出正确的安装顺序。软件包版本是否匹配、安装先后是否合法,都会影响系统稳定。
每个软件包有唯一编号,版本写成 a.b.c 三段。一行里先写编号和版本,后面可以跟若干依赖;依赖之间用空格分开,同一行里依赖的软件包编号不重复。依赖也可以一个都没有。
依赖只允许下面 5 种写法:
软件包编号>=版本号,例如 0>=2.1.0,表示依赖该软件包的 2.1.0 以及更高版本。软件包编号<=版本号,例如 3<=1.5.0,表示依赖该软件包的 1.5.0 以及更低版本。软件包编号>版本号,例如 2>0.0.1,表示必须高于该版本,不含该版本本身。软件包编号<版本号,例如 1<9.9.9,表示必须低于该版本,不含该版本本身。4,表示依赖这个软件包,但不限制版本。约束条件
1 ≤ m ≤ 100第一行一个整数 m,表示软件包数量。
接下来 m 行,每行描述一个软件包,格式为:软件包编号 版本号 依赖列表
如果版本约束有冲突,输出 -1。
如果存在循环依赖(自己依赖自己也算),输出 -2。
如果存在可行安装顺序,输出一种编号序列,数字之间用空格分开;有多种时输出数字序最小的那一种。
输入
2
0 1.0.0 1>3.0.0
1 3.0.0
输出
-1
说明
软件包 1 的版本是 3.0.0,不满足软件包 0 要求的大于 3.0.0,版本冲突。
输入
2
0 1.0.0 1
1 1.0.0 0
输出
-2
说明
软件包 0 依赖 1,软件包 1 又依赖 0,形成环。
输入
3
2 1.0.0 0 1
0 1.0.0
1 1.0.0
输出
0 1 2
说明
软件包 0 和 1 没有依赖,可以先装;软件包 2 依赖它们两个,必须放在后面。可行顺序有 0 1 2 和 1 0 2,数字序更小的是 0 1 2。
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册