最短経路問題
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(); }