-
Mình mới học java nên còn gà! Mọi người giúp mình lỗi này với!
mình làm bài tập lớn về thuật toán prim. do chưa tự viết được nên mình có tham khảo code trên mạng về thuật toán prim. mình đã sửa những chỗ có thể chương trình hết lỗi. nhưng chạy nó vẫn báo lỗi " cannot access file." mọi ng xem giúp mình với ! cám ơn moị người!
code:
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.url;
class node {
int x;
int y;
int delta_plus; /* edge starts from this node */
int delta_minus; /* edge terminates at this node */
int dist; /* distance from the start node */
int prev; /* previous node of the shortest path */
int succ,pred; /* node in sbar with finite dist. */
int w;
int h;
int pw;
int dx;
int dy;
string name;
}
class edge {
int rndd_plus; /* initial vertex of this edge */
int rndd_minus; /* terminal vertex of this edge */
int delta_plus; /* edge starts from rndd_plus */
int delta_minus; /* edge terminates at rndd_minus */
int len; /* length */
string name;
}
public class prim<u> extends applet implements mouselistener {
int n,m;
int u,snode; /* start node */
int pre_s_first, pre_s_last;
boolean isdigraph;
int iteration, step;
node v[] = new node[100];
edge e[] = new edge[200];
int findnode(string name) {
for (int i=0; i<n; i++)
if (v.name.equals(name))
return i;
return -1;
}
void input_graph(inputstream is) throws ioexception {
int x,y,l;
string s;
reader r = new bufferedreader(new inputstreamreader(is));
streamtokenizer st = new streamtokenizer(r);
//st.commentchar(#);
st.commentchar(3);
st.nexttoken(); n = (int)st.nval;
st.nexttoken(); m = (int)st.nval;
st.nexttoken(); s = st.sval;
isdigraph = "digraph".equals(s);
for (int i = 0; i<n; i++) {
node node = new node();
st.nexttoken(); node.name = st.sval;
st.nexttoken(); node.x = (int)st.nval;
st.nexttoken(); node.y = (int)st.nval;
v = node;
}
for (int i = 0; i<m; i++) {
edge edge = new edge();
st.nexttoken(); edge.name = st.sval;
switch (st.nexttoken()) {
case streamtokenizer.tt_number:
edge.rndd_plus = (int)st.nval;
break;
case streamtokenizer.tt_word:
edge.rndd_plus = findnode(st.sval);
break;
default:
break;
}
switch (st.nexttoken()) {
case streamtokenizer.tt_number:
edge.rndd_minus = (int)st.nval;
break;
case streamtokenizer.tt_word:
edge.rndd_minus = findnode(st.sval);
break;
default:
break;
}
st.nexttoken(); edge.len = (int)st.nval;
e = edge;
}
for (int i=0; i<n; i++) {
v.succ = v.pred = -2;
v.prev = v.dist = -1;
v.pw = 0;
}
iteration = step = 0;
}
void rdb() {
int i,k;
for (i=0; i<n; i++)
v.delta_plus = v.delta_minus = -1;
for (i=0; i<m; i++)
e.delta_plus = e.delta_minus = -1;
for (i=0; i<m; i++) {
k = e.rndd_plus;
if (v[k].delta_plus == -1)
v[k].delta_plus = i;
else {
k = v[k].delta_plus;
while(e[k].delta_plus >= 0)
k = e[k].delta_plus;
e[k].delta_plus = i;
}
k = e.rndd_minus;
if (v[k].delta_minus == -1)
v[k].delta_minus = i;
else {
k = v[k].delta_minus;
while(e[k].delta_minus >= 0)
k = e[k].delta_minus;
e[k].delta_minus = i;
}
}
}
void append_pre_s(int i) {
v.succ = v.pred = -1;
if (pre_s_first<0)
pre_s_first = i;
else
v[pre_s_last].succ = i;
v.pred = pre_s_last;
pre_s_last = i;
}
void remove_pre_s(int i) {
int succ = v.succ;
int pred = v.pred;
if (succ>=0)
v[succ].pred = pred;
else
pre_s_last = pred;
if (pred>=0)
v[pred].succ = succ;
else
pre_s_first = succ;
}
void step1() { /* initialize */
u = snode;
for (int i=0; i<n; i++) {
v.succ = v.pred = -2;
v.prev = v.dist = -1;
}
v.succ = -3;
v.dist = 0;
pre_s_first = pre_s_last = -1;
}
void step2() { /* replace labels */
int i,j;
j = v.delta_plus;
while (j>=0) {
i = e[j].rndd_minus;
if ((v.succ>=-2)&&((v.dist<0)||
(v.dist>e[j].len))) {
if (v.dist<0)
append_pre_s(i);
v.dist = e[j].len;
v.prev = u; /* label */
}
j = e[j].delta_plus;
}
if (!isdigraph) {
j = v.delta_minus;
while (j>=0) {
i = e[j].rndd_plus;
if ((v.succ>=-2)&&((v.dist<0)||
(v.dist>e[j].len))) {
if (v.dist<0)
append_pre_s(i);
v.dist = e[j].len;
v.prev = u; /* label */
}
j = e[j].delta_minus;
}
}
v.succ = -4;
}
void step3() { /* find the shortest node in sbar */
int i,rho;
rho = -1;
for (i = pre_s_first; i>=0; i = v.succ) {
if ((rho < 0)||(rho>v.dist)) {
rho = v.dist;
u = i;
}
}
remove_pre_s(u);
v.succ = -3;
}
void step4() {
v.succ = -4;
}
double weight(node n, double x, double y) {
double w,z,xx,yy;
w = 0;
for (int j = n.delta_plus; j>=0; j=e[j].delta_plus) {
xx = (double)(v[e[j].rndd_minus].x - n.x);
yy = (double)(v[e[j].rndd_minus].y - n.y);
z = (x*xx+y*yy)/math.sqrt((x*x+y*y)*(xx*xx+yy*yy))+1.0;
w += z*z*z*z;
}
for (int j = n.delta_minus; j>=0; j=e[j].delta_minus) {
xx = (double)(v[e[j].rndd_plus].x - n.x);
yy = (double)(v[e[j].rndd_plus].y - n.y);
z = (x*xx+y*yy)/math.sqrt((x*x+y*y)*(xx*xx+yy*yy))+1.0;
w += z*z*z*z;
}
return w;
}
void init_sub() {
int x[] = {1, 0, -1, 1, 0, -1};
int y[] = {1, 1, 1, -1, -1, -1};
int i,j,k;
double w,z;
for (i=0; i<n; i++) {
k=0;
w=weight(v,(double)x[0],(double)y[0]);
for (j=1; j<6; j++) {
z=weight(v,(double)x[j],(double)y[j]);
if (z<w) {
w = z;
k = j;
}
}
v.dx = x[k];
v.dy = y[k];
}
}
public void init() {
string mdname = getparameter("inputfile");
try {
inputstream is;
is = new url(getdocumentbase(),mdname).openstream();
input_graph(is);
try {
if (is != null)
is.close();
} catch(exception e) {
}
} catch (filenotfoundexception e) {
system.err.println("file not found.");
} catch (ioexception e) {
system.err.println("cannot access file.");
}
string s = getparameter("start");
if (s != null)
snode = integer.parseint(s);
else
snode = 0;
setbackground(color.white);
rdb();
init_sub();
addmouselistener(this);
}
public void paintnode(graphics g, node n, fontmetrics fm) {
string s;
int x = n.x;
int y = n.y;
int w = fm.stringwidth(n.name) + 10;
int h = fm.getheight() + 4;
n.w = w;
n.h = h;
if (n.succ<-2)
g.setcolor(color.blue);
else if (n.succ==-2)
g.setcolor(color.gray);
else
g.setcolor(color.red);
g.drawrect(x-w/2,y-h/2,w,h);
if (n.succ==-4)
g.setcolor(color.cyan);
else if (n.succ==-3)
g.setcolor(color.pink);
else if (n.succ>-2)
g.setcolor(color.yellow);
else
g.setcolor(getbackground());
g.fillrect(x-w/2+1,y-h/2+1,w-1,h-1);
g.setcolor(color.black);
g.drawstring(n.name,x-(w-10)/2,(y-(h-4)/2)+fm.getascent());
if (n.dist<0)
s = "";
else
s = ""+n.dist;
w = fm.stringwidth(s) + 10;
x += (h+1)*n.dx; y += (h+1)*n.dy;
g.setcolor(getbackground());
g.fillrect(x-n.pw/2,y-h/2,n.pw,h);
n.pw = w;
if (n.succ<-2)
g.setcolor(color.blue);
else
g.setcolor(color.red);
g.drawstring(s,x-(w-10)/2,y-(h-4)/2+fm.getascent ());
}
int [] xy(int a, int b, int w, int h) {
int x[] = new int[2];
if (math.abs(w*b)>=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 drawarrow(graphics g,int x1,int y1,int x2,int y2) {
int a = x1-x2;
int b = y1-y2;
if (isdigraph) {
double aa = math.sqrt(a*a+b*b)/16.0;
double bb = b/aa;
aa = a/aa;
g.drawline(x2,y2,x2+(int)((aa*12+bb*5)/13),y2+(int)((-aa*5+bb*12)/13));
g.drawline(x2,y2,x2+(int)((aa*12-bb*5)/13),y2+(int)((aa*5+bb*12)/13));
}
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 (v2.prev == e.rndd_plus) {
if ((v1.succ<-2)&&(v2.succ>=-2))
g.setcolor(color.red);
else
g.setcolor(color.blue);
} else {
g.setcolor(color.lightgray);
}
if ((!isdigraph)&&(v1.prev == e.rndd_minus)) {
if ((v2.succ<-2)&&(v1.succ>=-2))
g.setcolor(color.red);
else
g.setcolor(color.blue);
}
drawarrow(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);
if ((v2.prev == e.rndd_plus)||
((!isdigraph)&&(v1.prev == e.rndd_minus)))
g.setcolor(color.black);
else
g.setcolor(color.lightgray);
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; i++)
paintnode(g,v,fm);
for (int i=0; i<m; i++)
paintedge(g,e,fm);
}
public void update(graphics g) {
paint(g);
}
public void mousepressed(mouseevent ev) {
if (iteration==0) {
step1();
iteration++;
step = 2;
} else if (iteration>=n) {
step4();
iteration = 0;
} else {
if (step == 2) {
step2();
step = 3;
} else {
step3();
iteration++;
step = 2;
}
}
repaint();
}
public void mouseclicked(mouseevent event) {}
public void mousereleased(mouseevent event) {}
public void mouseentered(mouseevent event) {}
public void mouseexited(mouseevent event) {}
}
-
http://otvietnam.com/courses/lap-trinh-java/preview/ bạn học thêm khóa java ở đây nha
-
thực sự giờ mới học nên chưa có khả năng viết thuật toán này được. mà mình lại đang cần cho nó chạy để đi báo cáo cho có bài chạy. ai giúp mình cho nó chạy với. tks all!
Quyền viết bài
- Bạn Không thể gửi Chủ đề mới
- Bạn Không thể Gửi trả lời
- Bạn Không thể Gửi file đính kèm
- Bạn Không thể Sửa bài viết của mình
-
Nội quy - Quy định
Dự án Roxana Plaza Bình Dương được xây dựng bởi Cty Cổ phần NAVILAND thoải mái tối đa trục đường chính tiện ích tối ưu. Roxana Plaza Bình Dương thoải mái tối đa dân trí cao nội thất ngoại nhập. Khu...
Roxana Plaza Bình Dương Chung cư tiện ích cao cấp sát trung tâm