/*************************************/ /* Kruskal.java */ /* Copyright (C) 1997, 1998 K. Ikeda */ /*************************************/ import java.applet.*; import java.awt.*; import java.io.*; import java.net.URL; class Node { int x; int y; int set; int first; int next; int w; int h; String name; } class Edge { int rndd_plus; /* initial vertex of this edge */ int rndd_minus; /* terminal vertex of this edge */ int len; /* length */ int select; String name; } public class Kruskal extends Applet { int n,m; int num,den; int u, usel, step; Node v[] = new Node[100]; Edge e[] = new Edge[200]; int idx[] = new int[200]; int findNode(String name) { for (int i=0; iden) den = e[i].len; step1(); Krsub p = (Krsub)getAppletContext().getApplet("krsub"); if (p!=null) p.set(1,n,m,num,den,v,e,idx); step = 2; } void swap(int i, int j) { int k = idx[i]; idx[i] = idx[j]; idx[j] = k; } int partition(int left, int right) { int pivot = e[idx[(int)((left+right)/2)]].len; while (left<=right) { while (e[idx[left]].len < pivot) left++; while (e[idx[right]].len > pivot) right--; if (left <= right) swap(left++,right--); } return left; } void qsort(int left, int right) { int i; if (left >= right) return; i = partition(left,right); qsort(left,i-1); qsort(i,right); } void step1() { /* initialize */ for (int i=0; i=0; i = v[i].next) ; v[i].next = v[vr].first; j = v[vl].first; k = v[vl].set; for (i = v[vr].first; i>=0; i = v[i].next) { v[i].first = j; v[i].set = k; } } void step4() { for (; u=Math.abs(h*a)) { x[0] = ((b>=0)?1:-1)*a*h/b/2; x[1] = ((b>=0)?1:-1)*h/2; } else { x[0] = ((a>=0)?1:-1)*w/2; x[1] = ((a>=0)?1:-1)*b*w/a/2; } return x; } void drawEdge(Graphics g,int x1,int y1,int x2,int y2) { g.drawLine(x1,y1,x2,y2); } public void paintEdge(Graphics g, Edge e, FontMetrics fm) { Node v1 = v[e.rndd_plus]; Node v2 = v[e.rndd_minus]; int a = v1.x-v2.x; int b = v1.y-v2.y; int x1[] = xy(-a,-b,v1.w,v1.h); int x2[] = xy(a,b,v2.w,v2.h); if (e.select == -1 ) g.setColor(Color.black); else if (e.select == -2) g.setColor(Color.gray); else if (e.select == 1) g.setColor(Color.blue); else g.setColor(Color.red); drawEdge(g,v1.x+x1[0],v1.y+x1[1],v2.x+x2[0],v2.y+x2[1]); int w = fm.stringWidth("" + e.len); int h = fm.getHeight(); g.setColor(getBackground()); g.fillRect((v1.x+v2.x-w)/2,(v1.y+v2.y-h)/2,w,h); g.setColor(Color.black); g.drawString("" + e.len,(v1.x+v2.x-w)/2,(v1.y+v2.y-h)/2+fm.getAscent()); } public void paint(Graphics g) { FontMetrics fm = g.getFontMetrics(); for (int i=0; i= n-1) { step4(); step = 1; } else { if (step == 3) { step3(); step = 2; } else { step2(); step = 3; } } repaint(); return true; } }