数据结构之用DFS判断连通分量

package AizuOJ.Graph;

import java.util.Scanner;

/****
 * int[] find is to determine whether this point is repeated
 * AdjGraph G is Graph which records the information of points
 * Node is a node and its contents
 * union() is to determine whether the two points are connected by DFS
 * add() is to add two information of point in Graph
 */
public class ConnectedComponents {
    static class AdjGraph{ //
        static class Node{
            Node next;
            int val;

            public Node() {
                val = -1;
                next = null;
            }
        }

        public Node[] vertex;
        public AdjGraph(int Num){
            vertex = new Node[Num];
            for(int i =0;i<Num;i++)
            {
                vertex[i] = new Node();
                vertex[i].val = i;
            }
        }
        public void add(int x,int y){
            Node node = vertex[x].next;
            node = new Node();
            node.val = y;
            node.next = vertex[x].next;
            vertex[x].next = node;
        }
    }
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int N = in.nextInt();
        AdjGraph G = new AdjGraph(N);
        int M = in.nextInt();
        int[] find = new int[N];
        for(int i=0;i<M;i++)
        {
            int x,y;
            x = in.nextInt();
            y = in.nextInt();
            G.add(x,y);
        }
        int Q = in.nextInt();
        for(int i=0;i<Q;i++)
        {
            int x,y;
            x = in.nextInt();
            y = in.nextInt();
            if(union(x,y,find,G,N))
                System.out.println("yes");
            else
                System.out.println("no");
        }
    }

    private static boolean union(int s, int d,int[] find,AdjGraph G,int N) {
        boolean flag = false;
        if(G.vertex[s] == null)
            return false;
        AdjGraph.Node node = G.vertex[s];
        while(node != null){
            if(node.val == d)
                return true;
            else if(find[node.val] != 1)
            {
                find[node.val] = 1;
                flag = union(node.val,d,find,G,N);
                find[node.val] = 0;
                if(flag)
                    return true;
            }
            node = node.next;
        }
        return false;
    }

}

累了,想水一篇博客。这段代码貌似有错误,要是发现了即使告诉我吧多谢。
题目链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值