下面是求最小生成树代价的程序,图表示为 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;
}
}
暂无答案!
目前还没有任何答案,快来回答吧!