優先度キューには、優先度キューに要素が存在しても常にメソッドがfalseを返します。私はどのようにしてcompareメソッドをオーバーライドするのか分からない。これは、隣接リストを使用するDijkstraアルゴリズムのためのプログラムです。 このコードで@Override compareメソッドを実装する方法。優先度キューにはeleumeetが優先キューに存在しますが、常にfalseが返されます。
import java.util.*;
class dijkstra{
class AdjListNode{
private int vertex,weight;
AdjListNode(int v,int w){vertex=v;weight=w;}
int getv(){return vertex;}
int getw(){return weight;}
@Override
public boolean equals(AdjListNode obj){
return (obj.getv() == this.vertex && obj.getw()==this.weight);
}
}
class Graph{
private int V;
private LinkedList<AdjListNode> adj[];
Graph(int v){
V=v;
adj=new LinkedList[v];
for(int i=0;i<V;i++){
adj[i]=new LinkedList<AdjListNode>();
}
}
void addEdge(int u,int v,int w){
//undirected graph so edges are added bothways
AdjListNode node1=new AdjListNode(v,w);
adj[u].add(node1);
}
void print(){
for(int i=0;i<V;i++){
Iterator<AdjListNode> itr=adj[i].listIterator();
System.out.print(i+"==>");
while(itr.hasNext()){
AdjListNode node=itr.next();
System.out.print("("+node.getv()+","+node.getw()+") ");
}
System.out.println();
}
}
void sssp(int src){
PriorityQueue<AdjListNode> q = new PriorityQueue<AdjListNode>(V, new Comparator<AdjListNode>() {
@Override
public int compare(AdjListNode node1, AdjListNode node2) {
return Integer.compare(node1.getw(), node2.getw());
}
});
q.add(new AdjListNode(0,0));
int dist[]=new int[V];
Arrays.fill(dist,Integer.MAX_VALUE);
dist[src]=0;
while(q.size()!=0){
AdjListNode node=q.peek();
Iterator<AdjListNode> itr=adj[node.getv()].listIterator();
q.poll();
while(itr.hasNext()){
AdjListNode temp=itr.next();
if(dist[temp.getv()]>dist[node.getv()]+temp.getw()){
int oldweight=dist[temp.getv()];
dist[temp.getv()]=dist[node.getv()]+temp.getw();
//System.out.println(node.getv()+" "+temp.getv()+" "+oldweight+" "+q.contains(new AdjListNode(temp.getv(),oldweight)));
if(q.contains(new AdjListNode(temp.getv(),oldweight))){
System.out.println("yes");
q.remove(new AdjListNode(temp.getv(),oldweight));
q.add(new AdjListNode(temp.getv(),dist[temp.getv()]));
}
else{
q.add(new AdjListNode(temp.getv(),dist[temp.getv()]));
//System.out.println(q.contains(new AdjListNode(temp.getv(),dist[temp.getv()])));
}
}
}
}
for(int i=0;i<V;i++)
System.out.print(dist[i]+" ");
}
}
Graph newGraph(int vertices){
return new Graph(vertices);
}
public static void main(String[] args){
dijkstra d=new dijkstra();
Graph g=d.newGraph(6);
g.addEdge(0,1,2);
g.addEdge(0,3,30);
g.addEdge(0,5,40);
g.addEdge(0,4,5);
g.addEdge(0,2,60);
g.addEdge(1,4,11);
g.addEdge(1,3,5);
g.addEdge(1,2,2);
g.addEdge(1,5,4);
g.addEdge(2,1,3);
g.addEdge(2,3,1);
g.addEdge(2,4,3);
g.addEdge(3,4,3);
g.addEdge(3,5,11);
g.addEdge(4,3,2);
g.addEdge(4,5,12);
g.print();
g.sssp(0);
}
}
出力がエラーを示すと、正しい結果を返しますが、そこに行くいくつかのエラーがあるとメソッドが動作していないが含まれていません。正しいアプローチを提案してください。
私はこれを試しましたが、エラーが発生しました...メソッドが実装していないか、スーパータイプからメソッドをオーバーライドしました – gshivam63
あなたの試行した 'equals'実装を表示できますか? –
'equals'をオーバーライドすると、' equals'と一貫して 'hashCode'も常にオーバーライドします。 –