拓扑排序
①邻接表建图,所有的边都视为子节点指向父节点的边,并记录所有结点的入度,用数组d维护某结点通向各个子节点的长度中最大的两个路径长度。
②拓扑排序的同时,每枚举一个结点,就更新一下答案。
class Solution {
public:
int longestPath(vector<int>& parent, string s) {
int n=parent.size(),ans=0;
vector<vector<int>> e(n);
vector<int> deg(n,0);
vector<vector<int>> d(n,vector<int>(2,1));
for(int i=0;i<n;i++){
if(~parent[i]){
e[i].push_back(parent[i]);
deg[parent[i]]++;
}
}
queue<int> q;
for(int i=0;i<n;i++) if(!deg[i]) q.push(i);
while(!q.empty()){
int x=q.front();
q.pop();
ans=max(ans,d[x][0]+d[x][1]-1);
for(auto y:e[x]){
if(s[x]!=s[y]){
int w=max(d[x][0],d[x][1])+1;
if(w>d[y][0]){
d[y][1]=d[y][0];
d[y][0]=w;
}else d[y][1]=max(d[y][1],w);
}
if(!--deg[y]) q.push(y);
}
}
return ans;
}
};
时间复杂度:O(n)
空间复杂度:O(n)