321
社区成员




天然气运输成本昂贵,危险性高,为了节省运输成本,提倡绿色环保,需要尽可能的优化订单配送,比如相同地区的天然气订单可以一次性配送。 现需要向多个地区运输天然气。但是同一个地区可能有多个订单需求。当前仅只知道某些成对的订单是同一个地区的,同一个地区的天然气需要尽可能一次性配送从而降低运输成本,所以需要尽可能的将同一个地区的订单放在一起。订单的编号是1到n。
这个就得注意审题了,老顾在周赛里碰到了几次这个题目,都没想明白为什么没有AC,今天也是折腾了半天,没搞懂。。。。
最后,发现题目最后有一小段文字:订单的编号是1到n。好吧,没有列出来的订单号,就是单独配送的,需要补全。
n,m = map(int,input().split())
arr = [list(map(int,input().split())) for _ in range(m)]
v,d = {_ for _ in range(1,n + 1)},{}
for row in arr:
a,b = row
if a in d:
d[a].add(b)
else:
d[a] = {a,b}
if b in d:
d[b].add(a)
else:
d[b] = {a,b}
z = []
for i in sorted(d):
if i not in d:
continue
u = set()
while len(u) < len(d[i]):
n = list(d[i] - u)[0]
u.add(n)
if n != i:
if n in d:
d[i] = d[i].union(d[n])
for n in u:
if n in d:
del d[n]
z.append(sorted(u))
u = {x for u in z for x in u}
z += [[x] for x in v - u]
print(len(z))
for row in sorted(z):
print(*row)
首先,根据输入的 n 和 m 读入一个二维列表 arr,每一行都是一些数字组成的列表,代表输入表格中相应位置的数据。然后,我们需要使用这个二维列表来构建一个字典 d,其中字典的键是数字,值是一个集合,包含与该数字相邻的所有数字。
具体来说,我们可以遍历二维列表 arr 中的每一行,对于每一行中的两个数字 a 和 b,如果 a 已经在字典 d 中,则将 b 加入到 a 对应的集合中;否则,将 {a, b} 作为一个新的键值对加入到字典 d 中。同样地,如果 b 已经在字典 d 中,则将 a 加入到 b 对应的集合中;否则,将 {a, b} 作为一个新的键值对加入到字典 d 中。
接下来,我们需要对字典 d 进行一些处理。对于字典 d 中的每一个数字 i,我们将其相邻的数字加入到一个集合 u 中。具体来说,我们可以遍历字典 d 中的每一个数字 i,然后使用一个 while 循环来不断添加新的数字到集合 u 中,直到集合 u 的大小等于字典 d 中与 i 相邻的数字的数量。在添加数字的过程中,我们需要记录下添加的数字 n,并检查它是否与 i 相邻。如果不是,则将 n 加入到集合 u 中。最后,我们需要将集合 u 中的数字按照字典序排序,并将它们存储到一个列表 z 中。
最后,我们需要找到所有不在集合 u 中的数字 v,并将它们作为一个单独的列表存储到变量 u 中。然后将变量 z 和 u 合并成一个新的列表 y,并按照字典序对 y 进行排序。最后输出 y 的长度以及 y 中的所有列表即可。