有一棵个点的无权无根树,求有多少个点在树的直径上。
注意:树的直径可能不止一条。
const int MaxN = 1e5 + 5; typedef pair<int, int> pii; class Solution { private: vector<vector<int>> E; pii ans; pair<int, int> dfs(int s, int fa) { vector<pii> d; for (int i : E[s]) { if (i == fa) continue; pii tmp = dfs(i, s); d.push_back(tmp); } sort(d.begin(), d.end()); reverse(d.begin(), d.end()); if (d.size() == 0) { if (ans.first < 1) ans = {1, 1}; return {1, 1}; } else { int dmx = d[0].first; int dse = d.size() > 1 ? d[1].first : 0; int num = d[0].second + (d.size() > 1 ? d[1].second : 0); for (int i = 2; i < (int)d.size(); i++) { if (d[i].first != dse) { break; } num += d[i].second; } if (dmx + dse + 1 > ans.first) { ans = {dmx + dse + 1, num + 1}; } return {dmx + 1, dmx == dse ? num + 1 : d[0].second + 1}; } } public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * @param n int整型 节点个数 * @param u int整型vector * @param v int整型vector * @return int整型 */ int PointsOnDiameter(int n, vector<int>& u, vector<int>& v) { E = vector<vector<int>>(n + 1); ans = {0, 0}; for (int i = 0; i < n - 1; i++) { E[u[i]].push_back(v[i]); E[v[i]].push_back(u[i]); } dfs(1, 0); return ans.second; } }; /* 附赠俩样例: 7 1 2 1 5 5 6 2 3 2 4 4 7 ans = 6 11 1 2 1 5 5 6 2 3 2 4 4 7 1 8 8 9 9 10 9 11 ans = 8 */
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * @param n int整型 节点个数 * @param u int整型一维数组 * @param v int整型一维数组 * @return int整型 */ private int num=0; private int max=0; private HashSet<Integer> hash = new HashSet<>(); // private ArrayList<boolean[]> tmp_max = new ArrayList<>(); // private ArrayList<Integer> tmp_flag = new ArrayList<>(); public int PointsOnDiameter (int n, int[] u, int[] v) { // write code here ArrayList<Integer>[] graph = get_graph(n, u, v); ArrayList<Integer> end = bfs(n, graph); D_path(n, end, graph); return hash.size(); } @SuppressWarnings("unchecked") public ArrayList<Integer>[] get_graph(int n, int[] u, int[] v) { ArrayList<Integer>[] graph = new ArrayList[n]; for(int i=0; i<n; i++) graph[i] = new ArrayList<>(); for(int i=0; i<u.length; i++){ graph[u[i]-1].add(v[i]-1); graph[v[i]-1].add(u[i]-1); } return graph; } public ArrayList<Integer> bfs(int n, ArrayList<Integer>[] graph) { ArrayList<Integer> tmp = new ArrayList<>(); ArrayList<Integer> end = new ArrayList<>(); int[] flag = new int[n]; flag[0]=1; tmp.add(0); while(!tmp.isEmpty()){ end=new ArrayList<Integer>(tmp); int len=tmp.size(); for(int j=0; j<len; j++){ int node = tmp.get(0); for(int i=0; i<graph[node].size(); i++) { if(flag[graph[node].get(i)]==0) { flag[graph[node].get(i)]=1; tmp.add(graph[node].get(i)); } } tmp.remove(0); } } return end; } public void D_path(int n, ArrayList<Integer> end, ArrayList<Integer>[] graph){ // ArrayList<Integer> node = new ArrayList<>(); ArrayList<ArrayList<Integer>> paths = new ArrayList<>(); ArrayList<ArrayList<Integer>> one_end_path = new ArrayList<>(); ArrayList<ArrayList<Integer>> tmp = new ArrayList<>(); for(int s=0; s<end.size(); s++){ boolean[] flag = new boolean[n]; // node.add(end.get(s)); int node = end.get(s); ArrayList<Integer> path = new ArrayList<>(); path.add(node); tmp.add(new ArrayList<Integer>(path)); flag[node]=true; while(!tmp.isEmpty()){ one_end_path = new ArrayList<ArrayList<Integer>>(tmp); int len=tmp.size(); for(int i=0; i<len; i++){ path = tmp.get(0); int pth_node = path.get(path.size()-1); for(int j=0; j<graph[pth_node].size(); j++){ if(flag[graph[pth_node].get(j)]==false){ flag[graph[pth_node].get(j)]=true; path.add(graph[pth_node].get(j)); tmp.add(new ArrayList<Integer>(path)); path.remove(path.size()-1); } } tmp.remove(0); } } for(int i=0; i<one_end_path.size(); i++){ paths.add(one_end_path.get(i)); } } for(int i=0; i<paths.size(); i++){ ArrayList<Integer> path = paths.get(i); for(int j=0; j<path.size();j++){ hash.add(path.get(j)); } } return; } }方法2代码:用例通过率81.82%
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * @param n int整型 节点个数 * @param u int整型一维数组 * @param v int整型一维数组 * @return int整型 */ private int num=0; private int max=0; // private HashSet<Integer> hash = new HashSet<>(); private ArrayList<boolean[]> tmp_max = new ArrayList<>(); private ArrayList<Integer> tmp_flag = new ArrayList<>(); public int PointsOnDiameter (int n, int[] u, int[] v) { // write code here ArrayList<Integer>[] graph = get_graph(n, u, v); ArrayList<Integer> end = bfs(n, graph); boolean[] flag = new boolean[n]; // int[] d_node = new int[n]; for(int i=0; i<end.size(); i++){ dfs(end.get(i), graph, flag); } // HashSet<Integer> hash = new HashSet<>(); if(tmp_flag.size()==1){ return tmp_flag.get(0); } boolean res = false; int sum = 0; for(int i=0; i<n; i++){ res=false; for(int j=0; j<tmp_max.size(); j++){ res = tmp_max.get(j)[i]||res; } if(res) sum++; } return sum; } @SuppressWarnings("unchecked") public ArrayList<Integer>[] get_graph(int n, int[] u, int[] v) { ArrayList<Integer>[] graph = new ArrayList[n]; for(int i=0; i<n; i++) graph[i] = new ArrayList<>(); for(int i=0; i<u.length; i++){ graph[u[i]-1].add(v[i]-1); graph[v[i]-1].add(u[i]-1); } return graph; } public ArrayList<Integer> bfs(int n, ArrayList<Integer>[] graph) { ArrayList<Integer> tmp = new ArrayList<>(); ArrayList<Integer> end = new ArrayList<>(); int[] flag = new int[n]; flag[0]=1; tmp.add(0); while(!tmp.isEmpty()){ end=new ArrayList<Integer>(tmp); int len=tmp.size(); for(int j=0; j<len; j++){ int node = tmp.get(0); for(int i=0; i<graph[node].size(); i++) { if(flag[graph[node].get(i)]==0) { flag[graph[node].get(i)]=1; tmp.add(graph[node].get(i)); } } tmp.remove(0); } } return end; } public void dfs(int node, ArrayList<Integer>[] graph, boolean[] flag){ flag[node]=true; num=num+1; if(num>=max){ max=num; int len=tmp_flag.size(); for(int i=0; i<len; i++){ if(tmp_flag.get(0)<max) { tmp_max.remove(0); tmp_flag.remove(0); } } tmp_max.add(flag.clone()); tmp_flag.add(max); } for(int i=0; i<graph[node].size(); i++){ if(flag[graph[node].get(i)]==false){ dfs(graph[node].get(i), graph, flag); } } num=num-1; flag[node]=false; return; } }