This是该问题的链接。
它表示给定的边缘可以找到图形是否为树。
我正在检查边数是否小于节点数以及图中是否有循环。
为了检查图中是否有循环,我将节点标记为已访问,如果我再次面对同一节点并且它不是父节点。我推断它有一个循环。
我在下面这样做。它给了我TLE。我无法弄清楚我必须做什么优化。
class Main{
public static PrintWriter out;
public static boolean isTree(int node,HashSet<Integer> hs,HashMap<Integer,LinkedList<Integer>> graph, int parent){
hs.add(node);
LinkedList<Integer> children = graph.get(node);
Iterator<Integer> it = children.iterator();
boolean op = true;
while(it.hasNext()){
int child = it.next();
if(child!=parent && (hs.contains(child) || !isTree(child,hs,graph,node)))
return false;
}
return op;
}
public static void main(String[] args) {
HashMap<Integer,LinkedList<Integer>> graph = new HashMap<>();
MScan scan = new MScan();
int nodes = scan.nextInt();
for(int i=0; i<nodes; i++){
graph.put(i+1, new LinkedList<Integer>());
}
int edge = scan.nextInt();
if(nodes-edge!=1){
out = new PrintWriter(new BufferedOutputStream(System.out), true);
out.println("NO");
out.close();
}
else{
for(int i=0; i < edge; i++){
int first = scan.nextInt();
int second = scan.nextInt();
graph.get(first).add(second);
graph.get(second).add(first);
}
out = new PrintWriter(new BufferedOutputStream(System.out), true);
out.println((nodes-edge==1)?isTree(1,new HashSet<Integer>(),graph,-1)?"YES":"NO":"NO");
out.close();
}
}
}
答案 0 :(得分:0)
为什么使用哈希集?在此没有必要。存储和检索数据将花费一些时间。它就像一个min_heap数据结构(输入数据时需要重新整形的时间)。
因此,请改用普通的布尔数组。
我的C ++解决方案可能会帮助您更有效地做到这一点