1
0
mirror of https://gitee.com/coder-xiaomo/leetcode-problemset synced 2025-09-13 11:21:42 +08:00
Code Issues Projects Releases Wiki Activity GitHub Gitee
Files
leetcode-problemset/leetcode-cn/problem (Chinese)/有向无环图中合法拓扑排序的最大利润 [maximum-profit-from-valid-topological-order-in-dag].html
2025-05-15 01:05:54 +08:00

122 lines
5.1 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<p>给你一个由 <code>n</code> 个节点组成的<strong>有向无环图DAG</strong>,节点编号从 <code>0</code><code>n - 1</code>,通过二维数组 <code>edges</code> 表示,其中 <code>edges[i] = [u<sub>i</sub>, v<sub>i</sub>]</code> 表示一条从节点 <code>u<sub>i</sub></code> 指向节点 <code>v<sub>i</sub></code> 的有向边。每个节点都有一个对应的&nbsp;<strong>得分&nbsp;</strong>,由数组 <code>score</code> 给出,其中 <code>score[i]</code> 表示节点 <code>i</code> 的得分。</p>
<p>你需要以&nbsp;<strong>有效的拓扑排序&nbsp;</strong>顺序处理这些节点。每个节点在处理顺序中被分配一个编号从 <strong>1</strong> 开始的位置。</p>
<p>将每个节点的得分乘以其在拓扑排序中的位置,然后求和,得到的值称为&nbsp;<strong>利润</strong></p>
<p>请返回在所有合法拓扑排序中可获得的&nbsp;<strong>最大利润&nbsp;</strong></p>
<p><strong>拓扑排序&nbsp;</strong>是一个对 DAG 中所有节点的线性排序,使得每条有向边 <code>u → v</code> 中,节点 <code>u</code> 都出现在 <code>v</code> 之前。</p>
<p>&nbsp;</p>
<p><strong class="example">示例 1</strong></p>
<div class="example-block">
<p><strong>输入:</strong> <span class="example-io">n = 2, edges = [[0,1]], score = [2,3]</span></p>
<p><strong>输出:</strong> <span class="example-io">8</span></p>
<p><strong>解释:</strong></p>
<p><img src="https://pic.leetcode.cn/1745660258-BXXGjv-screenshot-2025-03-11-at-021131.png" style="width: 200px; height: 89px;" /></p>
<p>节点 1 依赖于节点 0因此一个合法顺序是 <code>[0, 1]</code></p>
<table style="border: 1px solid black;">
<thead>
<tr>
<th style="border: 1px solid black;">节点</th>
<th style="border: 1px solid black;">处理顺序</th>
<th style="border: 1px solid black;">得分</th>
<th style="border: 1px solid black;">乘数</th>
<th style="border: 1px solid black;">利润计算</th>
</tr>
</thead>
<tbody>
<tr>
<td style="border: 1px solid black;">0</td>
<td style="border: 1px solid black;">第 1 个</td>
<td style="border: 1px solid black;">2</td>
<td style="border: 1px solid black;">1</td>
<td style="border: 1px solid black;">2 × 1 = 2</td>
</tr>
<tr>
<td style="border: 1px solid black;">1</td>
<td style="border: 1px solid black;">第 2 个</td>
<td style="border: 1px solid black;">3</td>
<td style="border: 1px solid black;">2</td>
<td style="border: 1px solid black;">3 × 2 = 6</td>
</tr>
</tbody>
</table>
<p>所有合法拓扑排序中可获得的最大总利润是 <code>2 + 6 = 8</code></p>
</div>
<p><strong class="example">示例 2</strong></p>
<div class="example-block">
<p><strong>输入:</strong> <span class="example-io">n = 3, edges = [[0,1],[0,2]], score = [1,6,3]</span></p>
<p><strong>输出:</strong> <span class="example-io">25</span></p>
<p><strong>解释:</strong></p>
<p><img alt="" src="https://pic.leetcode.cn/1745660268-mJrEKY-screenshot-2025-03-11-at-023558.png" style="width: 200px; height: 124px;" /></p>
<p>节点 1 和 2 都依赖于节点 0因此最优的合法顺序是 <code>[0, 2, 1]</code></p>
<table style="border: 1px solid black;">
<thead>
<tr>
<th style="border: 1px solid black;">节点</th>
<th style="border: 1px solid black;">处理顺序</th>
<th style="border: 1px solid black;">得分</th>
<th style="border: 1px solid black;">乘数</th>
<th style="border: 1px solid black;">利润计算</th>
</tr>
</thead>
<tbody>
<tr>
<td style="border: 1px solid black;">0</td>
<td style="border: 1px solid black;">第 1 个</td>
<td style="border: 1px solid black;">1</td>
<td style="border: 1px solid black;">1</td>
<td style="border: 1px solid black;">1 × 1 = 1</td>
</tr>
<tr>
<td style="border: 1px solid black;">2</td>
<td style="border: 1px solid black;">第 2 个</td>
<td style="border: 1px solid black;">3</td>
<td style="border: 1px solid black;">2</td>
<td style="border: 1px solid black;">3 × 2 = 6</td>
</tr>
<tr>
<td style="border: 1px solid black;">1</td>
<td style="border: 1px solid black;">第 3 个</td>
<td style="border: 1px solid black;">6</td>
<td style="border: 1px solid black;">3</td>
<td style="border: 1px solid black;">6 × 3 = 18</td>
</tr>
</tbody>
</table>
<p>所有合法拓扑排序中可获得的最大总利润是 <code>1 + 6 + 18 = 25</code></p>
</div>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= n == score.length &lt;= 22</code></li>
<li><code>1 &lt;= score[i] &lt;= 10<sup>5</sup></code></li>
<li><code>0 &lt;= edges.length &lt;= n * (n - 1) / 2</code></li>
<li><code>edges[i] == [u<sub>i</sub>, v<sub>i</sub>]</code> 表示一条从 <code>u<sub>i</sub></code><code>v<sub>i</sub></code> 的有向边。</li>
<li><code>0 &lt;= u<sub>i</sub>, v<sub>i</sub> &lt; n</code></li>
<li><code>u<sub>i</sub> != v<sub>i</sub></code></li>
<li>输入图&nbsp;<strong>保证&nbsp;</strong>是一个 <strong>DAG</strong></li>
<li>不存在重复的边。</li>
</ul>