Files
dataStructures/graphs/weightedGraph.go
T
Acid 5fb97bc757
Go / build (push) Successful in 34s
new file: graphs/weightedGraph.go
2026-07-24 03:43:24 -04:00

91 lines
2.1 KiB
Go

package graphs
type Number interface {
~int | ~int8 | ~int16 | ~int32 | ~int64 |
~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 |
~float32 | ~float64
}
// Weighted Graph , undirected
type WeightedGraph[T comparable, W Number] struct {
adjList map[T]map[T]W
}
// NewWeightedGraph() -> Creates a Weighted Graph.
//
// gg := graphs.NewWeightedGraph[string, int]()
func NewWeightedGraph[T comparable, W Number]() *WeightedGraph[T, W] {
gp := &WeightedGraph[T, W]{
adjList: make(map[T]map[T]W),
}
return gp
}
// AddVertex() -> add vertex connected to vertex with weight
func (gp *WeightedGraph[T, W]) AddVertex(newVertex T, connectToVertex T, weight W) bool {
// early return
if newVertex == connectToVertex {
return false
}
gp.AddIsolatedVertex(newVertex)
gp.AddIsolatedVertex(connectToVertex)
_, exist := gp.adjList[newVertex][connectToVertex]
if !exist {
gp.adjList[newVertex][connectToVertex] = weight
gp.adjList[connectToVertex][newVertex] = weight
return true
}
return false
}
// AddIsolatedVertex() -> Creates an isolated Vertex returns True if ok ,
// false if vertex already exist
func (gp *WeightedGraph[T, W]) AddIsolatedVertex(newVertex T) bool {
_, exist := gp.adjList[newVertex]
if !exist {
gp.adjList[newVertex] = make(map[T]W)
return true
}
return false
}
// ConnectEdge() -> Connects two already existing vertices with a weighted edge.
// Returns false if either vertex is missing or the edge is already there.
func (gp *WeightedGraph[T, W]) ConnectEdge(vertex T, to T, weight W) bool {
if _, exist := gp.adjList[vertex]; !exist {
return false
}
if _, exist := gp.adjList[to]; !exist {
return false
}
return gp.AddVertex(vertex, to, weight)
}
// Display()
func (gp *WeightedGraph[T, W]) Display() map[T]map[T]W {
return gp.adjList
}
// Order() -> returns the amount of Vertices
func (gp *WeightedGraph[T, W]) Order() int {
return len(gp.adjList)
}
// Size() -> returns the amount of Edges
func (gp *WeightedGraph[T, W]) Size() int {
var size int
for _, inner := range gp.adjList {
size += len(inner)
}
return size / 2
}