from collections import defaultdict
import sys
# Read input values
num_workers, num_tasks, penalty_rate, total_time, num_avail_assign = map(int, sys.stdin.readline().split())
# Create an adjacency list to represent the graph
graph = defaultdict(list)
# Store the matching and degree arrays
matching = [-1] * num_tasks
degree = [0] * num_workers
# Array to track visited vertices during DFS
used = [0] * (num_workers + 1)
# Variable to track the current DFS iteration
T = 0
# Depth-first search function to find augmenting paths
def try_dfs(v, deg):
global T
if used[v] == T:
return False
used[v] = T
if degree[v] > deg + 1:
return True
for u in graph[v]:
if try_dfs(matching[u], deg):
degree[matching[u]] -= 1
matching[u] = v
degree[v] += 1
return True
return False
# Read the edges of the graph and build the adjacency list
for _ in range(num_avail_assign):
u, v = map(int, sys.stdin.readline().split())
u -= 1
v -= 1
graph[u].append(v)
# Initialize the matching and degree arrays
for u in range(num_tasks):
if matching[u] == -1:
for v in range(num_workers):
if u in graph[v] and matching[u] == -1:
matching[u] = v
degree[v] += 1
# Iterate until no more augmenting paths can be found
updated = True
while updated:
ds = [(degree[v], v) for v in range(num_workers)]
ds.sort()
T += 1
updated = any(try_dfs(v, degree[v]) for _, v in ds)
# Calculate penalty and collect the selected assignments
penalty = 0
res = []
for v in range(num_workers):
degree[v] = min(degree[v], total_time // penalty_rate)
for u in range(num_tasks):
if matching[u] != -1 and degree[matching[u]]:
penalty += degree[matching[u]] * penalty_rate
degree[matching[u]] -= 1
res.append((matching[u] + 1, u + 1, degree[matching[u]] * penalty_rate))
# Print the output
print(len(res), penalty)
for el in res:
print(el[0], el[1], el[2])
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
63 ms |
21008 KB |
Output is correct |
2 |
Correct |
63 ms |
20416 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
61 ms |
19240 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
85 ms |
21608 KB |
Output is correct |
2 |
Correct |
56 ms |
18688 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
124 ms |
23192 KB |
Output is correct |
2 |
Correct |
113 ms |
22908 KB |
Output is correct |
3 |
Correct |
56 ms |
19440 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
257 ms |
27536 KB |
Output is correct |
2 |
Correct |
243 ms |
27828 KB |
Output is correct |
3 |
Correct |
64 ms |
19336 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
304 ms |
27788 KB |
Output is correct |
2 |
Correct |
220 ms |
26500 KB |
Output is correct |
3 |
Correct |
91 ms |
21800 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
458 ms |
28604 KB |
Output is correct |
2 |
Correct |
313 ms |
27424 KB |
Output is correct |
3 |
Correct |
64 ms |
19928 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
374 ms |
26876 KB |
Output is correct |
2 |
Correct |
285 ms |
30580 KB |
Output is correct |
3 |
Correct |
296 ms |
27732 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
298 ms |
28148 KB |
Output is correct |
2 |
Correct |
51 ms |
19400 KB |
Output is correct |
3 |
Correct |
74 ms |
20680 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
387 ms |
27168 KB |
Output is correct |
2 |
Correct |
362 ms |
29336 KB |
Output is correct |
3 |
Correct |
189 ms |
23108 KB |
Output is correct |