Party BFS搜索最长路径 + 记忆化剪枝 || dfs(逆向思维找父亲)
Posted qq62bae010a10e9
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Party BFS搜索最长路径 + 记忆化剪枝 || dfs(逆向思维找父亲)相关的知识,希望对你有一定的参考价值。
题目链接
题意:
给你几棵树,让你找最深的层数。
思路:
这个题有很多做法,栈回溯,BFS, 直接模拟都可。不用剪枝也可以,用Vector[]e = new Vector[xxx];
存储标记,记得先将列表中的元素定义为Integer类型。
dfs,bfs对于邻接表都是的复杂度。
使用maxdp每次更新同一层的最大深度。
maxdp1更新每一分支的最大深度。做的很麻烦,但麻烦都花在了优化上面。
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
import java.util.Vector;
public class Main
public static void main(String[] args)
Scanner cin = new Scanner(System.in);
Queue<Integer>q = new LinkedList<Integer>();
Vector<Integer>[]e = new Vector[2005];
int n = cin.nextInt();
for (int i = 1; i <= n; i++)
e[i] = new Vector<Integer>();
for(int i = 1;i <= n;i++)
int v = cin.nextInt();
if(v != -1)
e[v].add(i);
int vis[] = new int[2005];
int deep[] = new int[2005];
int maxdp = 0, maxdp1 = 0;
int ans = 0;
for(int i = 1;i <= n;i++)
maxdp1 = 0;
if(e[i].size() != 0 && vis[i] == 0)
q.offer(i);///i 作为根节点开始
while(!q.isEmpty())
int u = q.poll();
maxdp = 0;
for(int j = 0;j < e[u].size();j++)
int v = e[u].get(j);
deep[v] = deep[u] + 1;
if(vis[v] != 0) ///maxdp 是 分支的最大层数
maxdp = Math.max(maxdp, vis[v] + deep[v] - 1);/// u - d
continue;
vis[v] = 1;
q.add(v);
maxdp = Math.max(deep[v], maxdp);
maxdp1 = Math.max(maxdp, maxdp1);
vis[i] = maxdp1 + 1;
ans = Math.max(vis[i], ans);
System.out.println(ans);
dfs
注意初始化
import java.util.Scanner;
import java.util.Vector;
public class Main
static Vector<Integer>[]v = new Vector[2005];
static int Max = 0;
static void dfs(int f, int cnt)
Max = Math.ACM搜索,剪枝Leetcode之深度优先搜索(DFS)专题-DFS+记忆化 329. 矩阵中的最长递增路径(Longest Increasing Path in a Matrix)