mirror of
https://github.com/harivansh-afk/veet-code.git
synced 2026-04-17 12:04:16 +00:00
45 lines
1.9 KiB
Python
45 lines
1.9 KiB
Python
"""
|
|
Task Scheduler
|
|
|
|
You're building a CI/CD pipeline orchestrator. Given a set of build tasks
|
|
with durations and dependency requirements, determine the minimum total
|
|
time to complete all tasks when independent tasks can run in parallel.
|
|
Also detect if the dependency graph contains a cycle (making the build
|
|
impossible).
|
|
|
|
Each task is represented as (name, duration, dependencies) where
|
|
dependencies is a list of task names that must complete before this
|
|
task can start.
|
|
|
|
Example 1:
|
|
Input: tasks = [("compile", 3, []), ("test", 5, ["compile"]), ("lint", 2, []), ("deploy", 1, ["test", "lint"])]
|
|
Output: (9, ["compile", "test", "deploy"])
|
|
Explanation: compile(3) -> test(5) -> deploy(1) = 9. lint(2) runs in parallel and finishes before deploy starts. The critical path is compile -> test -> deploy.
|
|
|
|
Example 2:
|
|
Input: tasks = [("A", 2, ["B"]), ("B", 3, ["A"])]
|
|
Output: (-1, [])
|
|
Explanation: Circular dependency between A and B makes execution impossible.
|
|
|
|
Example 3:
|
|
Input: tasks = [("X", 4, []), ("Y", 4, []), ("Z", 1, ["X", "Y"])]
|
|
Output: (5, ["X", "Z"])
|
|
Explanation: X and Y run in parallel (both take 4). Z waits for both, then takes 1. Critical path is X(4) -> Z(1) = 5 (or equivalently Y -> Z). Return either.
|
|
|
|
Constraints:
|
|
- Task names are unique non-empty strings
|
|
- Durations are positive integers (>= 1)
|
|
- Dependencies reference other task names in the list
|
|
- Return (-1, []) if a cycle exists
|
|
- The critical path is the longest path through the dependency graph
|
|
- If multiple critical paths have the same length, return any one
|
|
- The critical path list is ordered from first task to last
|
|
- All tasks must be completed; the answer is the makespan
|
|
"""
|
|
|
|
|
|
def schedule_tasks(
|
|
tasks: list[tuple[str, int, list[str]]],
|
|
) -> tuple[int, list[str]]:
|
|
"""Return (min_total_time, critical_path) or (-1, []) if cycle exists."""
|
|
pass # Your implementation here
|