DFS在图中找到桥时发生堆栈溢出

时间:2018-05-10 11:15:54

标签: java graph-theory depth-first-search

我的DFS在图中找到桥时正在进行stackoverflow。在这个问题中,我在具有顶点(1到n)的图中提供了边以及它们的id。我需要找出与给定id(q查询)相关的边是否是桥。请帮助我理解我的代码有什么问题:

import java.util.*;

class TestClass {

static int time=0;
static class pair{
    int v,id;
    pair(int v,int id){
        this.v=v;
        this.id=id;
    }
}

static class graph{
    static int v;
    static ArrayList<pair>[] adj;
     graph(int v){
         this.v=v;
         adj=new ArrayList[v+1];
         for(int i=1;i<=v;i++)
            adj[i]=new ArrayList<pair>();
     }

    static void addedge(int u,int v,int id){
        adj[u].add(new pair(v,id));
        adj[v].add(new pair(u,id));
    }
}
    static void dfs(graph g,int[] disc,int[] low,int[] parent,boolean[] visited,boolean[] bridge,int src){
        visited[src]=true;
        disc[src]=low[src]=++time;

        for(pair p:g.adj[src]){
            int i=p.v;
            int id=p.id;

            if(!visited[i]){
                //System.out.println(i);
                parent[i]=src;
                dfs(g,disc,low,parent,visited,bridge,i);
                low[src]=Math.min(low[src],low[i]);
                if(low[i]>disc[src]){
                    bridge[id]=true;
                }
            }
            else if(parent[src]!=i){
                low[src]=Math.min(low[src],disc[i]);
            }
        }
    }

public static void main(String args[] ) throws Exception {
    Scanner input=new Scanner(System.in);
    int n=input.nextInt();
    int m=input.nextInt();
    int q=input.nextInt();
    graph g=new graph(n);
    for(int i=0;i<m;i++){
        int u=input.nextInt();
        int v=input.nextInt();
        int id=input.nextInt();
        g.addedge(u,v,id);
    }

    int[] disc=new int[n+1];
    int[] parent=new int[n+1];
    int[] low=new int[n+1];
    boolean[] visited=new boolean[n+1];
    boolean[] bridge=new boolean[m+1];

    for(int i=1;i<=n;i++){
        if(!visited[i]){
            parent[i]=-1;
            dfs(g,disc,low,parent,visited,bridge,i);
        }
    }

    while(q-->0){
        int i=input.nextInt();
        if(bridge[i])
           System.out.println("YES");
        else
           System.out.println("no");
    }
}
}

0 个答案:

没有答案