結果
| 問題 |
No.679 不思議マーケット
|
| コンテスト | |
| ユーザー |
gew1fw
|
| 提出日時 | 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()
gew1fw