java—实现kruskal算法的代码产生错误的o/p

iyzzxitl  于 2021-07-11  发布在  Java
关注(0)|答案(0)|浏览(211)

下面是求最小生成树代价的程序,图表示为 ArrayList<ArrayList<Integer>> . 所以我先把所有的边 minHeap 调查他们是否形成一个循环,如果不是,我包括他们的 weight 在结果中。对于某些测试用例,我的代码给出了错误的o/p。
例如-输入:42(顶点)458(边)
1(u)2(v)214(重量)1 8 486 1 9 584 1 12 178 1 14 91 1 15 146 1 17 125 1 20 570 1 21 953 1 24 589 1 30 276 1 31 634 1 33 135 1 34 811 36 309。。。
它的正确输出是:2361
代码的输出是:2164

class MST {
static int spanningTree(int V, int E, ArrayList<ArrayList<Integer>> graph) {
    // Add your code here
    PriorityQueue<edge>heap=new PriorityQueue<>((e1,e2)->e1.wt-e2.wt);

    for(int i=0;i<V;i++){
        for(int j=0;j<V;j++){
            if(graph.get(i).get(j)>0){
                heap.offer(new edge(i,j,graph.get(i).get(j)));
                graph.get(j).set(i,0);
            }
        }
    }

    int [] parent=new int[V];
    for(int i=0;i<V;i++)
        parent[i]=i;

    int res=0;
    int edges=0;
    while(edges<V-1){
        edge e=heap.poll();
        if(!formCycle(parent,e.sc,e.dt)){
            res+=e.wt;
            edges++;
        }
    }

    return res;
}

static boolean formCycle(int [] parent,int sc,int dt){
    if(parent[sc]==parent[dt])
        return true;

    int p1=findParent(parent,sc);
    int p2=findParent(parent,dt);

    parent[p2]=p1;

    return false;
}

static int findParent(int [] parent,int i){
    if(parent[i]==i)
        return i;

    return parent[i]=findParent(parent,parent[i]);
}

}

class edge{
int sc,dt,wt;
edge(int sc,int dt,int wt){
    this.sc=sc;
    this.dt=dt;
    this.wt=wt;
}

}

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题