最短経路問題


class Node{
Point loc;
int val;
Node(Point p){
loc=new Point();
loc.x=p.x;
loc.y=p.y;
val=1000;
}
}
class Arc{
int srcId=-1;
int tgtId;
int weight;
Arc(int sid,int tid,int wt){
srcId=sid;
tgtId=tid;
weight=wt;
}
}
for(int i=0;i<Nodes.size();i++){
Node nd=(Node)Nodes.elementAt(i);
if(match(p,nd.loc)){
return;
}
}
以下は、接点を追加し、再表示を行います。
Node nd=new Node(p);
Nodes.add(nd);
newNode=false;
repaint();
mouseclicked()は、マウスボタンがクリックされたのち、話されたとき呼び出されます。したがって、mousePressedやmouseReleasedで代用できますが、ここでは処理を分散させるため利用しています。どちらの関数も呼び出されるので、重複処理をしないよう注意する必要があります。 public void mouseReleased(MouseEvent e){
Point p=e.getPoint();
if(dragOk){
for(int i=0;i<Nodes.size();i++){
Node nd=(Node)Nodes.elementAt(i);
if(match(p,nd.loc) && srcId >=0 ){
if(i != srcId ) tgtId=i;
int wt=Integer.parseInt(textField1.getText());
Arc arc=new Arc(srcId,tgtId,wt);
checkDouble(srcId,tgtId);
if (tgtId >=0) Arcs.add(arc);
}
}
}
dragOk=false;
srcId=-1;tgtId=-1;
repaint();
}
Enumeration em=Nodes.elements();
while(em.hasMoreElements()){
Node nd=(Node)em.nextElement();
pt=nd.loc;
g.setColor(clb);
g.fillOval(pt.x-20,pt.y-10,40,20);
g.setColor(clw);
g.drawString(Integer.toString(nd.val),pt.x-15,pt.y+5);
g.setColor(clb);
}
Enumeration ema=Arcs.elements();
Point pc=new Point();
while(ema.hasMoreElements()){
//draw line
Arc ac=(Arc)ema.nextElement();
Node ns=(Node)(Nodes.elementAt(ac.srcId));
Node nt=(Node)(Nodes.elementAt(ac.tgtId));
Point psrc=ns.loc;
Point ptgt=nt.loc;
g.setColor(clb);
g.drawLine(psrc.x,psrc.y,ptgt.x,ptgt.y);
//draw arc
//矢印を表示します。
//draw weight
pc.x=(psrc.x+ptgt.x)/2;
pc.y=(psrc.y+ptgt.y)/2;
g.setColor(clb);
g.fillRect(pc.x-10,pc.y-7,20,15);
g.setColor(clw);
g.drawString(Integer.toString(ac.weight),pc.x-7,pc.y+5);
g.setColor(clb);
}
boolean changed=true;
while(changed){
changed=false;
Enumeration ema=aplt.Arcs.elements();
//System.out.println("labelling");
while(ema.hasMoreElements()){
Arc ac=(Arc)ema.nextElement();
Node ns=(Node)(aplt.Nodes.elementAt(ac.srcId));
Node nt=(Node)(aplt.Nodes.elementAt(ac.tgtId));
if(nt.val > ns.val + ac.weight) {
nt.val = ns.val + ac.weight;
changed=true;
}
}
aplt.repaint();
}
synchronized public void waitButton(){
try{
wait();
}catch( InterruptedException e){}
}
ステップボタンが押されると、step() 処理を行い、notify();でwait状態を解除します。同期処理を行うため、各メソッドには、synchronized の指定が必要です。 synchronized public void step(){
notify();
}