gramoloss
Version:
Graph theory package for edition and computation
112 lines (83 loc) • 3.54 kB
text/typescript
import { Coord } from "../coord";
import { Graph } from "../graph";
import { ORIENTATION } from "../link";
import { Vertex } from "../vertex";
// chi(Pn) = 2
// chi(Cn) = 2 or 3 if n is odd, for n >= 3
// chi(Kn) = n
console.log("chi(P2) = 2")
console.log(Graph.fromEdges([[0,1],[1,2]]).chromaticNumber() == 2);
console.log("chi(P3) = 2")
console.log(Graph.fromEdges([[0,1],[1,2],[2,3]]).chromaticNumber() == 2);
console.log("chi(K3) = 3")
console.log(Graph.fromEdges([[0,1],[1,2],[2,0]]).chromaticNumber() == 3);
console.log("chi(K4) = 4")
console.log(Graph.clique(4).chromaticNumber() == 4);
console.log("chi(K5) = 5")
console.log(Graph.clique(5).chromaticNumber() == 5);
console.log("chi(C5) = 3")
console.log(Graph.fromEdges([[0,1],[1,2],[2,3],[3,4],[4,0]]).chromaticNumber() == 3);
console.log("chi(Petersen) = 3")
console.log(Graph.fromEdges([[0,1],[1,2],[2,3],[3,4],[4,0],[0,5],[1,6],[2,7],[3,8],[4,9],[5,7],[7,9],[9,6],[6,8],[8,5]]).chromaticNumber() == 3);
// Speed test
const petersenGraph = Graph.fromEdges([[0,1],[1,2],[2,3],[3,4],[4,0],[0,5],[1,6],[2,7],[3,8],[4,9],[5,7],[7,9],[9,6],[6,8],[8,5]]);
const lgp = Graph.lineGraph(petersenGraph);
console.time('chromaticNumber');
console.log(Graph.fromEdges([[0,1],[1,2]]).chromaticNumber() == 2);
console.log(Graph.fromEdges([[0,1],[1,2],[2,3]]).chromaticNumber() == 2);
console.log(Graph.fromEdges([[0,1],[1,2],[2,0]]).chromaticNumber() == 3);
console.log(Graph.fromEdges([[0,1],[0,2],[0,3],[1,2],[1,3],[2,3]]).chromaticNumber() == 4);
console.log(Graph.fromEdges([[0,1],[1,2],[2,3],[3,4],[4,0]]).chromaticNumber() == 3);
console.log(Graph.fromEdges([[0,1],[1,2],[2,3],[3,4],[4,0],[0,5],[1,6],[2,7],[3,8],[4,9],[5,7],[7,9],[9,6],[6,8],[8,5]]).chromaticNumber() == 3);
console.timeEnd('chromaticNumber');
console.time('vPetersen');
const n = 6;
const g = Graph.clique(n);
const lgp2 = Graph.lineGraph(g);
const cliques = new Set<Set<Vertex>>();
for (let i = 0 ; i < n ; i ++){
const clique = new Set<Vertex>();
for (const link of g.links.values()){
if (link.startVertex.index == i || link.endVertex.index == i){
const vertexLink = lgp2.vertices.get(link.index);
if (typeof vertexLink != "undefined"){
clique.add(vertexLink);
}
}
}
cliques.add(clique);
}
console.log(lgp2.chromaticNumber(cliques));
console.timeEnd('vPetersen');
console.log( petersenGraph.minimalProperColoring());
checkGeomChromaticClique(4)
// K4 in circle should have GCI 4
function checkGeomChromaticClique(n: number){
const g2 = new Graph();
const v0 = g2.addVertex(0, 0, 0);
const v1 = g2.addVertex(1, 1, 0);
const v2 = g2.addVertex(2, 0, 1);
const v3 = g2.addVertex(3, 1, 1);
g2.addEdge(v0, v1);
g2.addEdge(v0, v2);
g2.addEdge(v0, v3);
g2.addEdge(v1, v2);
g2.addEdge(v1, v3);
g2.addEdge(v2, v3);
const glg2 = Graph.geometricLineGraph(g2);
const cliques = new Set<Set<Vertex>>();
for (let i = 0 ; i < n ; i ++){
const clique = new Set<Vertex>();
for (const link of g2.links.values()){
if (link.startVertex.index == i || link.endVertex.index == i){
const vertexLink = glg2.vertices.get(link.index);
if (typeof vertexLink != "undefined"){
clique.add(vertexLink);
}
}
}
cliques.add(clique);
}
console.log(glg2.chromaticNumber(cliques));
// console.log(glg2.minimalProperColoring(cliques));
}