楼主:
oin1104 (是oin的说)
2025-02-25 01:12:40※ 引述 《Rushia (早瀬ユウカの体操服)》 之铭言:
:
: https://leetcode.com/problems/most-profitable-path-in-a-tree
: 2467. Most Profitable Path in a Tree
: 给你一个大小为n-1的阵列表示边,表示无向图的n个点,alice从0出发,bob从bob出发
: ,两者同时出发,他们会拿走每个点上面的分数,如果他们遇到了则会平分分数,alice
: 可以走到任意的叶子节点(不含0),bob只能走到0,求出alice可能拿到的最大分数。
:
: 思路:
: 1.bob只能走到0,所以我们可以先找出bob走到0的路径中,走到每个点花的时间,用dfs
: 找就可以了,如果路径终点不为0,该点就标记成无限大。
: 2.alice用dfs遍历所有点,如果这个点bob比你早走过你就拿不到分数,如果你们同时到
: 就平分,如果你早到就全拿,当走到叶子节点的时候取最大的分数。
:
:
思路
一样
重点就是要知道bob有走过的地方
在那个地方他们两个人走了多远
就可以知道当前该0 1/2 或是1了
然后他们两个的dfs逻辑不太一样
所以分开来写
0.0
今天好麻烦
```cpp
class Solution {
public:
vector<int> passed;
vector<int> bobpassed;
unordered_map<int,int> bobmap;
unordered_map<int,vector<int>> path;
vector<int> amounts;
int res;
void bob(int now , int dist , vector<int>& sb)
{
sb.push_back(now);
if(now == 0)
{
for(int i = 0 ; i < sb.size() ; i ++)
{
bobmap[sb[i]] = i+1;
}
return ;
}
for(int nxt : path[now] )
{
if(bobpassed[nxt] == 1)continue;
bobpassed[nxt] = 1;
bob(nxt , dist+1 , sb);
}
sb.pop_back();
}
void alice(int now , int dist , int money)
{
if(bobmap[now] == dist)
{
money += amounts[now]/2;
}
else if(bobpassed[now] == 1 && bobmap[now] < dist)
{
}
else
{
money += amounts[now];
}
// cout << now << " " << money << " " << dist << endl;
if(path[now].size() == 1 && now != 0)
{
res = max(res,money);
return;
}
for(int nxt : path[now])
{
if(passed[nxt] == 1)continue;
passed[nxt] = 1;
alice(nxt , dist+1 , money);
}
}
int mostProfitablePath(vector<vector<int>>& edges, int bobh, vector<int>& am
ount)
{
res = INT_MIN;
int n = edges.size();
amounts = amount;
passed.resize(n+1,0);
bobpassed.resize(n+1,INT_MAX);
for(int i = 0 ; i <= n ; i ++)
{
bobmap[i] = INT_MAX;
}
for(int i = 0 ; i < n ; i ++)
{
path[edges[i][0]].push_back(edges[i][1]);
path[edges[i][1]].push_back(edges[i][0]);
}
vector<int> hi;
bobpassed[bobh] = 1;
bob(bobh , 1 , hi );
passed[0] = 1;
alice(0,1,0);
return res;
}
};
```