Party BFS搜索最长路径 + 记忆化剪枝 || dfs(逆向思维找父亲)

Posted qq62bae010a10e9

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Party BFS搜索最长路径 + 记忆化剪枝 || dfs(逆向思维找父亲)相关的知识,希望对你有一定的参考价值。

​​题目链接​​

题意:

给你几棵树,让你找最深的层数。

思路:

这个题有很多做法,栈回溯,BFS, 直接模拟都可。不用剪枝也可以,用Vector[]e = new Vector[xxx];
存储标记,记得先将列表中的元素定义为Integer类型。

dfs,bfs对于邻接表都是Party的复杂度。

使用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)

出界的路径数--dfs记忆化+剪枝

wenbao与记忆化搜索

最短路径问题

poj 1088 滑雪 DP(dfs的记忆化搜索)