图的广度,深度搜索

//图类的创建
public class Graph {
    //顶点数
   private final int V;
   //边的总数
   private int Lines;
   private ArrayList<ArrayList<Integer>> table;
    public Graph(int v) {
        V = v;
        Lines=0;
        table= new ArrayList<ArrayList<Integer>>();
        for (int i = 0; i <v ; i++) {
            table.add(new ArrayList<Integer>());
        }

    }

    public int getV() {
        return V;
    }

    public int getLines() {
        return Lines;
    }
    public void addEdge(int m,int n){
        table.get(m).add(n);
        table.get(n).add(m);
        Lines++;

    }
    public ArrayList<Integer> RelatedV(int v){
        return table.get(v);
    }

}
//深度搜索
public class DepthFirst {
    public boolean[] marked;
    private int count;//查找所有与该点相通的点
    public DepthFirst(Graph G,int goal){
        marked = new boolean[G.getV()];
        count=0;
       df(G, goal);
    }
    private void df(Graph G,int goal){
        marked[goal]=true;
        for (Integer m: G.RelatedV(goal)) {  //八皇后路径问题,有for才有多条路径因为for存在才会有反向回溯,没for最多只有一条
            if (marked[m]==false){
                df(G, m);
            }
        }
        count++;  //count++的位置值得想想
    }
    //判断是否与当前节点连通
    public boolean marked(int x){
        return marked[x];
    }

    public int getCount() {
        return count;
    }
}
//广度
public class WidthFirst {
    boolean[] marked;
    int count;
    LinkedList<Integer> waitSearch;
    public WidthFirst(Graph g,int goal){
        marked=new boolean[g.getV()];
        count=0;
        waitSearch=new LinkedList<Integer>();
        WidthFirstSearch(g, goal);
    }
    public void WidthFirstSearch(Graph g,int flag){

//              waitSearch.addFirst(flag);
//        while (!waitSearch.isEmpty()){
//            Integer head = waitSearch.removeFirst();
//            if (marked[head]==false){
//                System.out.print(head+"->");
//                marked[head]=true;
//                count++;
//            }
//            ArrayList<Integer> list = g.RelatedV(head);
//            for (int i = 0; i < list.size() ; i++) {
//                if (marked[list.get(i)]==false) {
//                    waitSearch.addLast(list.get(i));
//                  //  marked[list.get(i)]=true;    要么进队的时候设置,要么出队设置,不要弄混淆,否则这个数永远都不会被打印
//                }
//            }
//        }
        waitSearch.addLast(flag);
        while (!waitSearch.isEmpty()){
            Integer first = waitSearch.removeFirst();
              if (marked[first]==false){
                  marked[first]=true;
                  count++;
              }
            ArrayList<Integer> list = g.RelatedV(first);
            for (int i = 0; i <list.size() ; i++) {
                Integer content = list.get(i);
                if (marked[content]==false){
                    waitSearch.addLast(content);
                }
            }
        }

    }
    public boolean remarked(int x){
        return marked[x];
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值