グラフ構造の入力メニュー【自己ループ[無向グラフ,有向グラフ(辺入力)]・多重辺[無向グラフ,有向グラフ (辺入力)) 】
【STEP: 1】コード
reader.on('close', () => {
const Matrix = []; // 隣接行列
const N = Number(lines[0]);
for (let i = 1; i <= N; i++) {
Matrix.push(lines[i].split(' ').map(Number));
}
const self_loop = [0];
for (let i = 0; i < N; i++) {
if (Matrix[i][i]) {
self_loop[0]++;
self_loop.push(i + 1);
}
}
self_loop.forEach(value => {
console.log(value);
});
});
隣接行列…n × n の2次元配列。頂点 i ・ j が 辺で直接つながっていれば i 行目 j 列目の要素を1。さもなくば 0。
【STEP: 2】コード
reader.on('close', () => {
const Matrix = []; // 隣接行列
const N = Number(lines[0]);
for (let i = 1; i <= N; i++) {
Matrix.push(lines[i].split(' ').map(Number));
}
// console.log(Matrix);
const multiple_sides = [
[0]
];
for (let i = 0; i < N; i++) {
for (let j = 0; j < N; j++) {
if (Matrix[i][j] >= 2) {
multiple_sides[0][0]++;
multiple_sides.push([i + 1, j + 1]);
Matrix[j][i] = 0;
}
}
}
multiple_sides.forEach(value => {
console.log(...value);
});
});
多重辺…グラフの同じ頂点の組をつなげている複数の辺。
つまり 2車線とか3車線みたいな感じ?
【STEP: 3】コード
reader.on('close', () => {
const Matrix = []; // 隣接行列
const N = Number(lines[0]);
for (let i = 1; i <= N; i++) {
Matrix.push(lines[i].split(' ').map(Number));
}
const self_loop = [0];
for (let i = 0; i < N; i++) {
if (Matrix[i][i]) {
self_loop[0]++;
self_loop.push(i + 1);
}
}
self_loop.forEach(value => {
console.log(value);
});
});
自己ループ…入口と出口が同じで 直結しているってことですよね。
Task
【STEP: 4】コード
reader.on('close', () => {
function adjacency_Matrix(a, b) {
Matrix[a][b]++;
}
const Matrix = []; // 隣接行列
const [N, M] = lines[0].split(' ').map(Number);
for (let i = 0; i < N; i++) {
Matrix[i] = new Array(N).fill(0);
}
for (let i = 1; i < M; i++) {
const [A, B] = lines[i].split(' ').map(e => e - 1);
adjacency_Matrix(A, B);
}
// console.log(Matrix);
const self_loop = [0];
for (let i = 0; i < N; i++) {
if (Matrix[i][i]) {
self_loop[0]++;
self_loop.push(i + 1);
}
}
self_loop.forEach(value => {
console.log(value);
});
});
多重辺有向グラフ…辺が同じ方向に向かっていても 行き違っていても 辺が 2本以上あれば多重線。
【STEP: 5】コード
reader.on('close', () => {
function adjacency_Matrix(a, b) {
Matrix[a][b]++;
}
const Matrix = []; // 隣接行列
const [N, M] = lines[0].split(' ').map(Number);
for (let i = 0; i < N; i++) {
Matrix[i] = new Array(N).fill(0);
}
for (let i = 1; i < M; i++) {
const [A, B] = lines[i].split(' ').map(e => e - 1);
adjacency_Matrix(A, B);
}
// console.log(Matrix);
const multiple_sides = [
[0]
];
for (let i = 0; i < N; i++) {
for (let j = 0; j < N; j++) {
if (Matrix[i][j] >= 2 || (Matrix[i][j] && Matrix[j][i])) {
multiple_sides[0][0]++;
multiple_sides.push([i + 1, j + 1]);
Matrix[j][i] = 0;
}
}
}
multiple_sides.forEach(value => {
console.log(...value);
});
});
入力値を基に 隣接行列を生成して 「自己ループ」の辺を持つ頂点を探索。
【FINAL】コード
reader.on('close', () => {
function adjacency_Matrix(a, b) { // 隣接行列の値を更新
Matrix[a][b]++;
}
const Matrix = []; // 隣接行列
const [N, M] = lines[0].split(' ').map(Number);
for (let i = 0; i < N; i++) {
Matrix[i] = new Array(N).fill(0);
}
for (let i = 1; i <= M; i++) {
const [A, B] = lines[i].split(' ').map(e => e - 1);
adjacency_Matrix(A, B);
}
// console.table(Matrix);
const multiple_sides = [
[0]
];
for (let i = 0; i < N; i++) {
for (let j = 0; j < N; j++) {
if (Matrix[i][j] >= 2 || (Matrix[i][j] && Matrix[j][i])) {
multiple_sides[0][0]++;
multiple_sides.push([i + 1, j + 1]);
Matrix[j][i] = 0;
}
}
}
multiple_sides.forEach(value => {
console.log(...value);
});
});
入力値を基に 隣接行列を生成して 「多重辺」の存在する頂点の組を探索。
コメント