前提・実現したいこと
最小全域木を描画したいです
発生している問題・エラーメッセージ
エラーメッセージ
該当のソースコード
Java
ソースコード
// 点のx座標とy座標を記憶する配列
int[] ax = new int[]{100, 200, 300, 400, 100, 200, 300, 400, 100, 200, 300, 400, 100, 200, 300, 400}; // 点の x 座標を記憶する配列
int[] ay = new int[]{100, 100, 100, 100, 200, 200, 200, 200, 300, 300, 300, 300, 400, 400, 400, 400};// 点の y 座標を記憶する配列
int[][] NW = new int[16][16]; // 枝のコストを保存する配列(0は繋がっていない枝を表す)
int[] S = new int[16]; // 最初に選んだ点と同じ部分集合に 1:含まれる、0:含まない を表す配列
int[][] Tree = new int[16][2]; // どの点と点を繋ぐかを記憶する配列
void setup() {
size(500, 500);
background(255);
decide_weight(); // 枝のコストを決める
draw_line(); // グラフの枝を描く
draw_ellipse(); // グラフの円を描く
draw_text(); // 円の番号を書く
draw_weight(); // 枝のコストを書く
Prim(); // 最小全域木を求める
draw_tree(); // 最小全域木を描く
}
// 枝を描く関数
void draw_line(){
int i,j;
strokeWeight(10);
for( i=0; i<16; i++ ){
for( j=0; j<16; j++ ){
if( NW[i][j] != 0 ){
line(ax[i], ay[i], ax[j], ay[j] );
}
}
}
}
// 点(円)を描く関数
void draw_ellipse(){
int i;
strokeWeight(2);
for( i=0; i<16; i++ ){
ellipse( ax[i], ay[i], 50, 50 );
}
}
// 点番号を書く関数
void draw_text(){
int i;
String s;
PFont myFont = loadFont("Arial-Black-18.vlw");
textFont(myFont);
textAlign(CENTER, CENTER);
fill(0);
for( i=0; i<16; i++ ){
s = ""+i;
text(s, ax[i], ay[i]);
}
}
// エッジの重みを書く関数
void draw_weight(){
int i, j;
String s;
PFont myFont = loadFont("Arial-Black-24.vlw");
textFont(myFont);
textAlign(CENTER, CENTER);
fill(255,125,125);
for( i=0; i<16; i++ ){
for( j=0; j<16; j++ ){
if( NW[i][j] > 0 ){
s = ""+NW[i][j];
text(s, (ax[i]+ax[j])/2, (ay[i]+ay[j])/2 );
}
}
}
}
// 枝のコストを決定する関数
void decide_weight(){
int i,j;
// randomSeed(0) の0の部分は,各自の学籍番号の下1桁にします。
// この数値を変えると生成される乱数が変わります。
randomSeed(0);
for( i=0; i<16; i++ ){
for( j=0; j<16; j++ ){
NW[i][j] = 0;
}
}
// 横方向の枝
NW[0][1] = NW[1][0] = (int)random(1, 30);
NW[1][2] = NW[2][1] = (int)random(1, 30);
NW[2][3] = NW[3][2] = (int)random(1, 30);
NW[4][5] = NW[5][4] = (int)random(1, 30);
NW[5][6] = NW[6][5] = (int)random(1, 30);
NW[6][7] = NW[7][6] = (int)random(1, 30);
NW[8][9] = NW[9][8] = (int)random(1, 30);
NW[9][10] = NW[10][9] = (int)random(1, 30);
NW[10][11] = NW[11][10] = (int)random(1, 30);
NW[12][13] = NW[13][12] = (int)random(1, 30);
NW[13][14] = NW[14][13] = (int)random(1, 30);
NW[14][15] = NW[15][14] = (int)random(1, 30);
// 縦方向の枝
NW[0][4] = NW[4][0] = (int)random(1, 30);
NW[4][8] = NW[8][4] = (int)random(1, 30);
NW[8][12] = NW[12][8] = (int)random(1, 30);
NW[1][5] = NW[5][1] = (int)random(1, 30);
NW[5][9] = NW[9][5] = (int)random(1, 30);
NW[9][13] = NW[13][9] = (int)random(1, 30);
NW[2][6] = NW[6][2] = (int)random(1, 30);
NW[6][10] = NW[10][6] = (int)random(1, 30);
NW[10][14] = NW[14][10] = (int)random(1, 30);
NW[3][7] = NW[7][3] = (int)random(1, 30);
NW[7][11] = NW[11][7] = (int)random(1, 30);
NW[11][15] = NW[15][11] = (int)random(1, 30);
}
// 最小全域木を求める関数
void Prim(){
int i,j,x=0,min=100,index=0,z=0;
S[0]=1;
while(z<15){
for(i=0;i<16;i++){
if(S[i]==1)
for(j=0;j<16;j++){
NW[i][j]=x;
if(min>x){
min=x;
index=i;
}
}
}
S[index]=1;
}
}
// 結果を描く関数
void draw_tree(){
}
試したこと
最小全域木を求める関数を打ち込んでみたが上手くいきませんでした
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
あなたの回答
tips
プレビュー