获得TLE解决SPOJ PT07Y

时间:2017-04-11 06:11:53

标签: algorithm graph tree dfs

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();
        }
    }
}

1 个答案:

答案 0 :(得分:0)

为什么使用哈希集?在此没有必要。存储和检索数据将花费一些时间。它就像一个min_heap数据结构(输入数据时需要重新整形的时间)。

因此,请改用普通的布尔数组。
我的C ++解决方案可能会帮助您更有效地做到这一点

https://github.com/joy-mollick/Problem-Solving-Solutions/blob/master/SPOJ-PT07Y%20-%20Is%20it%20a%20tree.cpp