結果
問題 |
No.679 不思議マーケット
|
ユーザー |
![]() |
提出日時 | 2025-06-12 19:56:55 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 72 ms / 2,000 ms |
コード長 | 3,585 bytes |
コンパイル時間 | 211 ms |
コンパイル使用メモリ | 82,484 KB |
実行使用メモリ | 72,960 KB |
最終ジャッジ日時 | 2025-06-12 19:57:26 |
合計ジャッジ時間 | 2,001 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 18 |
ソースコード
import sys from collections import deque def main(): sys.setrecursionlimit(1 << 25) n, m = map(int, sys.stdin.readline().split()) conditions = {} for _ in range(m): parts = sys.stdin.readline().split() g_i = int(parts[0]) r_i = int(parts[1]) h_list = list(map(int, sys.stdin.readline().split())) conditions[g_i] = h_list # 构建DAG in_degree = {i: 0 for i in range(1, n+1)} adj = {i: [] for i in range(1, n+1)} # 添加条件依赖 for g_i, h_list in conditions.items(): for h_j in h_list: adj[h_j].append(g_i) in_degree[g_i] += 1 # 拓扑排序 queue = deque() for i in range(1, n+1): if in_degree[i] == 0: queue.append(i) topo_order = [] while queue: u = queue.popleft() topo_order.append(u) for v in adj[u]: in_degree[v] -= 1 if in_degree[v] == 0: queue.append(v) # 处理没有条件的商品 for i in range(1, n+1): if i not in conditions: # 这些商品必须被放在任何位置,但为了最大化条件满足,我们将其安排在可能影响条件的位置 # 这里直接将它们添加到拓扑排序的最前面,以确保它们的条件被满足 # 但这样可能不正确,因为它们的条件可能依赖于其他商品 # 因此,可能需要重新处理 pass # 重新构建拓扑排序,包括那些没有条件的商品 # 这个部分可能需要更复杂的处理,例如将所有没有条件的商品视为必须被处理的节点,并安排在它们的条件依赖它们的g_i之前 # 这可能需要重新构建DAG,包括所有商品 # 重新构建DAG,包括所有商品的条件 in_degree = {i: 0 for i in range(1, n+1)} adj = {i: [] for i in range(1, n+1)} for g_i, h_list in conditions.items(): for h_j in h_list: adj[h_j].append(g_i) in_degree[g_i] += 1 # 拓扑排序 queue = deque() for i in range(1, n+1): if in_degree[i] == 0: queue.append(i) topo_order = [] while queue: u = queue.popleft() topo_order.append(u) for v in adj[u]: in_degree[v] -= 1 if in_degree[v] == 0: queue.append(v) # 处理没有条件的商品 for i in range(1, n+1): if i not in conditions: # 这些商品必须被放入购物车,无论它们的位置如何 # 所以,我们需要确保它们在任何情况下都被处理 # 这可能意味着,它们可以被放置在任何位置,但为了满足其他商品的条件,可能需要将它们放置在前面 # 这里,我们将它们添加到拓扑排序的最前面 if i not in topo_order: topo_order.insert(0, i) # 现在,模拟购物车的放入过程 cart = set() count = 0 for item in topo_order: if item in conditions: h_list = conditions[item] # 检查所有h_list中的商品是否都在cart中 satisfied = True for h in h_list: if h not in cart: satisfied = False break if satisfied: cart.add(item) count += 1 else: # 没有条件,必须放入 cart.add(item) count += 1 print(count) if __name__ == '__main__': main()