2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
समीपता लिङ्क्ड् सूचीप्रतिपादने प्रत्येकं शिखरम् विववि तत्र लिङ्क्ड् सूची अस्ति, लिङ्क्ड् सूचीयां प्रत्येकं नोड् एकं दासं प्रतिनिधियति विववि प्रारम्भिक धार।गणनाय क्रमेण GTG^Tजीटी, अस्माकं भ्रमणस्य आवश्यकता अस्ति जी.जीजी for each edge of , तथा धारस्य दिशां विपर्यय्य, योजयन्तु GTG^Tजीटी तत्सम्बद्धे लिङ्क् कृतसूचौ ।
भाषा कार्यान्वयनम् गच्छतु:
package main
import (
"fmt"
)
// Graph 使用邻接链表表示
type Graph struct {
vertices int
adjList map[int][]int
}
// NewGraph 创建一个新的图
func NewGraph(vertices int) *Graph {
return &Graph{
vertices: vertices,
adjList: make(map[int][]int),
}
}
// AddEdge 添加一条边到图中
func (g *Graph) AddEdge(u, v int) {
g.adjList[u] = append(g.adjList[u], v)
}
// Transpose 计算图的转置
func (g *Graph) Transpose() *Graph {
gT := NewGraph(g.vertices)
for u, adj := range g.adjList {
for _, v := range adj {
gT.AddEdge(v, u) // 反转边的方向
}
}
return gT
}
func main() {
g := NewGraph(4)
g.AddEdge(0, 1)
g.AddEdge(0, 2)
g.AddEdge(1, 2)
g.AddEdge(2, 0)
g.AddEdge(2, 3)
gT := g.Transpose()
fmt.Println("Original Graph:")
for u, adj := range g.adjList {
fmt.Printf("%d -> %vn", u, adj)
}
fmt.Println("nTransposed Graph:")
for u, adj := range gT.adjList {
fmt.Printf("%d -> %vn", u, adj)
}
}
कालजटिलता:
adjacency matrix representation इत्यस्मिन् वयं edge information इत्यस्य संग्रहणार्थं द्वि-आयामी सरणीं उपयुञ्ज्महे, यत्र matrix[u][v]
तः रेखा अस्ति वा इति सूचयति उउउ आगच्छति विववि पृष्ठभाग।गणनाय क्रमेण GTG^Tजीटी, वयं मैट्रिक्सस्य उपरितनत्रिकोणं (अथवा अधः त्रिकोणं, भवतः आकृतिप्रतिपादन-अभ्यासानां आधारेण) पारं कुर्मः तथा च किनारेनां दिशां विपर्ययामः अर्थात् matrix[u][v]
मूल्यं नियुक्तं भवतिmatrixT[v][u]
。
भाषा कार्यान्वयनम् गच्छतु(सरलीकृतं संस्करणं, केवलं अस्तित्वं विचारयति तथा च धारभारं न विचारयति):
// 假设使用二维布尔切片表示邻接矩阵
type GraphMatrix [][]bool
// Transpose 计算图的转置
func (g GraphMatrix) Transpose() GraphMatrix {
n := len(g)
gT := make(GraphMatrix, n)
for i := range gT {
gT[i] = make([]bool, n)
}
for i := 0; i < n; i++ {
for j := 0; j < n; j++ {
gT[j][i] = g[i][j] // 反转边的方向
}
}
return gT
}
// 注意:这里没有完整的GraphMatrix类型实现,因为示例仅关注Transpose函数
कालजटिलता:
समीपतासूचिकाद्वारा प्रतिनिधितस्य निर्देशितस्य आलेखस्य कृते वयं प्रत्येकस्य शिखरस्य समीपस्थशिखरस्य समीपतासूचीं भ्रमित्वा नूतनलेखस्य स्थानान्तरितशिखरस्य समीपतासूचौ योजयितुं शक्नुमः विशिष्टानि पदानि निम्नलिखितरूपेण सन्ति ।
समयजटिलताविश्लेषणम् : मूललेखस्य प्रत्येकं शिखरं भ्रमितुं आवश्यकम् ओ ( ∣ वि ∣ ) ओ(|व|) .ओ(∣वि∣) प्रत्येकस्य शिखरस्य समीपतासूचीं भ्रमितुं आवश्यकः समयः अस्ति ओ ( ∣ ई ∣ ) ओ(|ई|)ओ(∣ई∣) समयः, अतः कुलकालजटिलता अस्ति ओ ( ∣ वि ∣ + ∣ ई ∣ ) ओ(|व| + |ई|)ओ(∣वि∣+∣ई∣)。
समीपतामात्रिकायाः प्रतिनिधित्वेन निर्देशितस्य आलेखस्य कृते मूललेखस्य समीपतामात्रिकायाः स्थानान्तरणं कृत्वा नूतनस्य आलेखस्य समीपतामात्रिकां प्राप्तुं शक्नुमः विशिष्टानि पदानि निम्नलिखितरूपेण सन्ति ।
समयजटिलताविश्लेषणम् : मूललेखस्य समीपतामात्रिकायाः भ्रमणस्य आवश्यकता भवति हे ( ∣ वि ∣ २ ) ओ(|V|^2) .ओ(∣वि∣2) समयः, अतः कुलकालजटिलता अस्ति हे ( ∣ वि ∣ २ ) ओ(|V|^2) .ओ(∣वि∣2)。
Go भाषायां कार्यान्वितः कोडः निम्नलिखितः अस्ति ।
// 邻接链表表示的有向图转置
func transposeAdjList(G map[int][]int) map[int][]int {
GT := make(map[int][]int)
for v, neighbors := range G {
for _, u := range neighbors {
GT[u] = append(GT[u], v)
}
}
return GT
}
// 邻接矩阵表示的有向图转置
func transposeAdjMatrix(G [][]int) [][]int {
n := len(G)
GT := make([][]int, n)
for i := range GT {
GT[i] = make([]int, n)
}
for i := 0; i < n; i++ {
for j := 0; j < n; j++ {
GT[j][i] = G[i][j]
}
}
return GT
}
adjacency linked list representation इत्यस्मिन् वयं प्रत्यक्षतया मूलप्रतिबिम्बं भ्रमितुं शक्नुमः जी.जीजीततः प्रत्येकस्य नोडस्य समीपतासूची प्रत्येकस्य धारस्य दिशां विपर्यय्य नूतने आलेखे योज्यते । GTG^{T} ९.जीटीतत्सम्बद्धे नोडस्य उपरि ।
type Graph struct {
Vertices []*Node // 存储图中所有节点的指针
}
type Node struct {
Value int
Adjacent []*Node // 存储与该节点相邻的所有节点的指针
}
func (g *Graph) Transpose() *Graph {
transposed := &Graph{make([]*Node, len(g.Vertices))}
for i, node := range g.Vertices {
transposed.Vertices[i] = &Node{node.Value, make([]*Node, 0)}
}
for _, node := range g.Vertices {
for _, adj := range node.Adjacent {
// 将边反向添加到转置图中
transposed.Vertices[adj.Value].Adjacent = append(transposed.Vertices[adj.Value].Adjacent, transposed.Vertices[node.Value])
}
}
return transposed
}
अतः कुलकालजटिलता अस्ति ओ ( ∣ वि ∣ + ∣ ई ∣ ) ओ(|व| + |ई|)ओ(∣वि∣+∣ई∣)。
adjacency matrix notation इत्यस्मिन् वयं नूतनं adjacency matrix निर्मातुं शक्नुमः ततः मूलप्रतिबिम्बं पारयितुं शक्नुमः जी.जीजीadjacency matrix, matrix इत्यस्मिन् प्रत्येकं तत्त्वम् ( इ , ज ) (इ, ज) .(अहम्,झ)नूतनमात्रिकायाः नियुक्तः ( ज , इ ) (ज, इ) .(झ,अहम्)स्थितिः, एवं धारस्य व्यावृत्तिः समाप्तः ।
type MatrixGraph struct {
Matrix [][]bool // 存储邻接矩阵
}
func (mg *MatrixGraph) Transpose() *MatrixGraph {
transposed := &MatrixGraph{make([][]bool, len(mg.Matrix))}
for i := range mg.Matrix {
transposed.Matrix[i] = make([]bool, len(mg.Matrix))
for j := range mg.Matrix[i] {
// 将边反向赋值到转置矩阵中
transposed.Matrix[i][j] = mg.Matrix[j][i]
}
}
return transposed
}
अतः कुलकालजटिलता अस्ति हे ( ∣ वि ∣ २ ) ओ(|V|^2) .ओ(∣वि∣2)。
समीपता लिङ्क्ड् सूचीप्रतिपादनस्य कृते, ट्रांसपोज एल्गोरिदम् इत्यस्य समयजटिलता अस्ति ओ ( ∣ वि ∣ + ∣ ई ∣ ) ओ(|व| + |ई|)ओ(∣वि∣+∣ई∣), तथा च समीपतामात्रिकप्रतिपादनस्य कृते, ट्रांसपोज-एल्गोरिदमस्य समयजटिलता अस्ति हे ( ∣ वि ∣ २ ) ओ(|V|^2) .ओ(∣वि∣2) .व्यावहारिकप्रयोगेषु यदि आलेखः तुल्यकालिकरूपेण विरलः भवति (अर्थात् । ∣ ई ∣ |ई|∣ई∣अपेक्षया बहु लघुतरम् ∣ वि ∣ २ |व|^२∣वि∣2 ), समीपतालिङ्कितसूचीप्रतिपादनस्य उपयोगः अधिकं कार्यक्षमः भविष्यति ।यदि आलेखः सघनः (अर्थात्। ∣ ई ∣ |ई|∣ई∣समीपः ∣ वि ∣ २ |व|^२∣वि∣2), तर्हि समीपतामात्रिकप्रतिपादनं अधिकं उपयुक्तं भवेत् ।
आलेखप्रतिपादने, समीपतालिङ्क्ड् सूचीः, समीपतामात्रिका च द्वौ अपि सामान्यतया प्रयुक्तौ पद्धतौ स्तः । अनिर्देशित-निर्देशित-आलेखानां प्रतिनिधित्वार्थं समीपता-लिङ्क्-सूचीनां उपयोगः भवति, यदा तु समीपता-मात्रिकाणां उपयोगः प्रायः अनिर्देशित-आलेखानां प्रतिनिधित्वार्थं भवति । निर्देशितस्य आलेखस्य स्थानान्तरणार्थं वयं समीपतालिङ्कितसूचौ, समीपतामात्रिकायां च पृथक् कार्यं कर्तुं शक्नुमः ।
समीपतालिङ्कितसूचया प्रतिनिधितस्य निर्देशितस्य आलेखस्य कृते मूललेखस्य प्रत्येकं शिखरं भ्रमित्वा मूललेखस्य बहिर्गच्छन्तीनां किनारेषु आगच्छन्तीषु किनारेषु परिवर्तनं कृत्वा आलेखस्य स्थानान्तरणं प्राप्तुं शक्यते
package main
import (
"fmt"
)
// 定义图的顶点结构
type Vertex struct {
Name string
Edges []*Vertex
Visited bool
}
// 计算图的转置
func Transpose(g *Vertex) {
for _, v := range g.Edges {
// 遍历顶点v的所有出边
for _, w := range v.Edges {
// 在原图中查找顶点w指向顶点v的边,并反转
for i, e := range w.Edges {
if e == v {
w.Edges[i] = v
break
}
}
}
}
}
func main() {
// 创建顶点
a := &Vertex{Name: "A"}
b := &Vertex{Name: "B"}
c := &Vertex{Name: "C"}
// 建立有向图关系
a.Edges = []*Vertex{b, c}
b.Edges = []*Vertex{a}
c.Edges = []*Vertex{a}
// 打印原图
fmt.Println("原图:")
PrintGraph(a)
// 计算转置图
Transpose(a)
// 打印转置图
fmt.Println("转置图:")
PrintGraph(a)
}
// PrintGraph 用于打印图的邻接链表表示
func PrintGraph(g *Vertex) {
g.Visited = true
for _, v := range g.Edges {
if !v.Visited {
fmt.Println(g.Name, "->", v.Name)
PrintGraph(v)
}
}
}
समीपतामात्रिकायाः प्रतिनिधित्वेन निर्देशितस्य आलेखस्य कृते मूललेखस्य प्रत्येकं पङ्क्तिं नूतनलेखस्य तत्सम्बद्धस्तम्भे परिणमयित्वा आलेखस्य स्थानान्तरणं कर्तुं शक्यते
package main
import (
"fmt"
)
// 计算邻接矩阵的转置
func TransposeMatrix(mat [][]int) [][]int {
transposed := make([][]int, len(mat[0]))
for i := range transposed {
transposed[i] = make([]int, len(mat))
}
for i, row := range mat {
for j, val := range row {
if val == 1 {
transposed[j][i] = 1
}
}
}
return transposed
}
func main() {
// 创建邻接矩阵
originalMatrix := [][]int{
{0, 1, 1},
{0, 0, 1},
{1, 0, 0},
}
// 计算转置矩阵
transposedMatrix := TransposeMatrix(originalMatrix)
// 打印转置矩阵
fmt.Println("转置矩阵:")
for _, row := range transposedMatrix {
fmt.Println(row)
}
}
समीपतालिङ्कितसूचिकायाः स्थानान्तरणार्थं एल्गोरिदमस्य समयजटिलता O(E) भवति, यत्र E आलेखे धारसङ्ख्या अस्ति । यतो हि प्रत्येकं धारं एकवारं भ्रमितव्यम् ।
समीपतामात्रिकायाः स्थानान्तरणार्थं एल्गोरिदमस्य समयजटिलता O(V^2) भवति, यत्र V आलेखे शिखरसङ्ख्या अस्ति । यतो हि प्रत्येकं आकृतितत्त्वं एकवारं भ्रमितुं आवश्यकं भवति, तथा च आकृतिः V×V भवति ।
एते अल्गोरिदम् सर्वे कार्यकुशलाः, चालिताः च सन्ति
निर्देशितं आलेखं गणयितुं एल्गोरिदम् कार्यान्वितुं जी.जीजी transposition of GTG^{T} ९.जीटी , वयं क्रमशः adjacency linked list तथा adjacency matrix इत्येतयोः प्रतिनिधित्वद्वयं संसाधितुं शक्नुमः । अधः अहं क्रमशः एतयोः प्रकरणयोः एल्गोरिदम्स् वर्णयिष्यामि तथा च Go भाषायां कोड् उदाहरणानि प्रदास्यामि ।
newAdjList
स्थानान्तरितलेखस्य संग्रहणार्थं प्रयुक्तम् ।adjList
。(u, v)
, योजयतु newAdjList[v]
मध्यं।newAdjList
。type Graph struct {
vertices []*Vertex
}
type Vertex struct {
key int
adjacent []*Vertex
}
func (g *Graph) Transpose() *Graph {
gt := &Graph{make([]*Vertex, len(g.vertices))}
for i := range g.vertices {
gt.vertices[i] = &Vertex{key: i}
}
for _, u := range g.vertices {
for _, v := range u.adjacent {
// Add edge (v, u) to the transpose graph.
gt.vertices[v.key].adjacent = append(gt.vertices[v.key].adjacent, gt.vertices[u.key])
}
}
return gt
}
अस्य अल्गोरिदमस्य चालनसमयः O(|V| + |E|) अस्ति, यत्र |V| इति शिखरसङ्ख्या अस्ति तथा च |E|. यतो हि अस्माभिः सर्वाणि शिखराणि धाराणि च एकवारं भ्रमितव्यानि ।
newAdjMatrix
स्थानान्तरितलेखस्य संग्रहणार्थं प्रयुक्तम् ।adjMatrix
。adjMatrix[i][j]
, तस्य नियुक्तिः newAdjMatrix[j][i]
。newAdjMatrix
。type Graph struct {
matrix [][]bool
}
func (g *Graph) Transpose() *Graph {
gt := &Graph{make([][]bool, len(g.matrix))}
for i := range gt.matrix {
gt.matrix[i] = make([]bool, len(g.matrix))
}
for i := range g.matrix {
for j := range g.matrix[i] {
// Copy the adjacency values with swapped indices.
gt.matrix[j][i] = g.matrix[i][j]
}
}
return gt
}
अस्य अल्गोरिदमस्य चालनसमयः O(|V|^2) अस्ति, यत्र |V| इति शिखरसङ्ख्या अस्ति । यतो हि अस्माभिः सम्पूर्णं समीपतामात्रिकं भ्रमितव्यं, समीपतामात्रिकायाः आकारः च |V|.
उपर्युक्तं कोड उदाहरणं केवलं एल्गोरिदम् इत्यस्य मूलभागः अस्ति वास्तविक-अनुप्रयोगेषु अन्यकार्यं यथा त्रुटि-नियन्त्रणं, निवेशः, निर्गमः च योजयितुं आवश्यकाः भवितुम् अर्हन्ति । तदतिरिक्तं कोडस्य सरलीकरणाय कल्प्यते यत् आलेखे पुनरावृत्तिधाराः नास्ति तथा च शिखरसङ्ख्याः 0 तः आरभ्य क्रमेण संख्याकृताः सन्ति
निम्नलिखितम् एकः एल्गोरिदम् अस्ति यः आलेख G तः G^T गणयितुं Go भाषायां लिखितः अस्ति, तदनुरूपं समीपता लिङ्क् कृतसूची तथा समीपता मैट्रिक्स प्रतिनिधित्वविधयः अपि दत्ताः सन्ति:
package main
import "fmt"
// 图的节点结构体
type Node struct {
Value int // 节点的值
Next *Node // 下一个节点指针
}
// 邻接链表表示法的图结构体
type Graph struct {
Vertices []*Node // 图中所有节点的数组
}
// 添加有向边到邻接链表
func (g *Graph) AddEdge(u, v int) {
newNode := &Node{Value: v}
if g.Vertices[u] == nil {
g.Vertices[u] = newNode
} else {
curr := g.Vertices[u]
for curr.Next != nil {
curr = curr.Next
}
curr.Next = newNode
}
}
// 输出邻接链表表示的图信息
func (g *Graph) Print() {
for i, node := range g.Vertices {
fmt.Printf("顶点 %d:", i)
for node != nil {
fmt.Printf("%d ", node.Value)
node = node.Next
}
fmt.Println()
}
}
// 获取图 G 的转置图 G^T 的邻接链表表示法
func GetTranspose(g *Graph) *Graph {
transpose := &Graph{
Vertices: make([]*Node, len(g.Vertices)),
}
for i, node := range g.Vertices {
for node != nil {
v := node.Value
// 在转置图中添加反向边
transpose.AddEdge(v, i)
node = node.Next
}
}
return transpose
}
// 输出邻接链表表示的转置图信息
func PrintTranspose(g *Graph) {
fmt.Println("转置图 G^T:")
g.Print()
}
// 邻接矩阵表示法的图结构体
type Matrix struct {
Vertices [][]int // 邻接矩阵,存储边的连接关系(0 表示无边,1 表示有边)
}
// 初始化邻接矩阵表示的图
func InitMatrix(numVertices int) *Matrix {
matrix := &Matrix{
Vertices: make([][]int, numVertices),
}
for i := range matrix.Vertices {
matrix.Vertices[i] = make([]int, numVertices)
}
return matrix
}
// 添加有向边到邻接矩阵
func (m *Matrix) AddEdge(u, v int) {
m.Vertices[u][v] = 1
}
// 获取图 G 的转置图 G^T 的邻接矩阵表示法
func GetTransposeMatrix(m *Matrix) *Matrix {
numRows := len(m.Vertices)
numCols := len(m.Vertices[0])
transpose := InitMatrix(numRows)
for i := 0; i < numRows; i++ {
for j := 0; j < numCols; j++ {
if m.Vertices[i][j] == 1 {
// 在转置矩阵中添加反向边
transpose.AddEdge(j, i)
}
}
}
return transpose
}
// 输出邻接矩阵表示的转置图信息
func PrintTransposeMatrix(m *Matrix) {
numRows := len(m.Vertices)
numCols := len(m.Vertices[0])
fmt.Println("转置图 G^T:")
for i := 0; i < numRows; i++ {
fmt.Printf("顶点 %d:", i)
for j := 0; j < numCols; j++ {
if m.Vertices[i][j] == 1 {
fmt.Printf("%d ", j)
}
}
fmt.Println()
}
}
func main() {
// 邻接链表表示的有向图 G
g := &Graph{
Vertices: make([]*Node, 4),
}
g.AddEdge(0, 1)
g.AddEdge(1, 2)
g.AddEdge(2, 3)
g.AddEdge(3, 1)
// 输出原始图 G 的邻接链表表示法
fmt.Println("原始图 G:")
g.Print()
// 获取转置图 G^T 的邻接链表表示法并输出
transpose := GetTranspose(g)
PrintTranspose(transpose)
// 邻接矩阵表示的有向图 G
m := InitMatrix(4)
m.AddEdge(0, 1)
m.AddEdge(1, 2)
m.AddEdge(2, 3)
m.AddEdge(3, 1)
// 输出原始图 G 的邻接矩阵表示法
fmt.Println("原始图 G:")
for _, row := range m.Vertices {
fmt.Println(row)
}
// 获取转置图 G^T 的邻接矩阵表示法并输出
transposeMatrix := GetTransposeMatrix(m)
PrintTransposeMatrix(transposeMatrix)
}
अस्य अल्गोरिदमस्य समयजटिलता O(V + E) अस्ति, यत्र V शिखरसङ्ख्या, E च धारसङ्ख्या । स्थानान्तरितलेखस्य निर्माणप्रक्रियायां मूललेखस्य सर्वान् किनारेन् भ्रमित्वा विपर्यस्तरूपेण स्थानान्तरितलेखे योजयितुं आवश्यकं भवति, अतः कुलसमयजटिलता शिखरस्य धारयोः च संख्यायाः आनुपातिकं भवति
निर्देशित-लेखानां स्थानान्तरित-आलेखाः मुख्यतया द्वयोः आँकडा-संरचनयोः प्रतिनिधित्वं कर्तुं शक्यन्ते: समीपता-लिङ्क्-सूचिकाः, समीपता-मात्रिकाः च । अधः अहं क्रमशः एतयोः प्रकरणयोः एल्गोरिदम्स् परिचययिष्यामि तथा च Go भाषायां नमूनासङ्केतं प्रदास्यामि ।
समीपता लिङ्क्ड् सूचीद्वारा प्रतिनिधितस्य आलेखस्य कृते वयं प्रत्येकस्य शिखरस्य समीपतासूचीं भ्रमित्वा ततः प्रत्येकस्मिन् समीपताबिन्दौ विपरीतधारं योजयित्वा आलेखं स्थानान्तरयितुं शक्नुमः अस्याः पद्धतेः कालजटिलता O(V + E) भवति, यत्र V शिखरसङ्ख्या, E च धारसङ्ख्या ।
type Vertex struct {
Value int
Adj []Vertex
}
func transposeGraph(graph []Vertex) []Vertex {
transposed := make([]Vertex, len(graph))
for _, v := range graph {
for _, adjV := range v.Adj {
// 为邻接点添加反向边
found := false
for _, tV := range transposed[adjV.Value].Adj {
if tV.Value == v.Value {
found = true
break
}
}
if !found {
transposed[adjV.Value].Adj = append(transposed[adjV.Value].Adj, v)
}
}
}
return transposed
}
adjacency matrix द्वारा प्रतिनिधितस्य graph कृते वयं matrix इत्यस्य पङ्क्तयः स्तम्भान् च स्वैप् कृत्वा transpose इत्येतत् कार्यान्वितुं शक्नुमः । अस्य पद्धतेः कालजटिलता O(V^2) अस्ति ।
func transposeMatrix(matrix [][]int) [][]int {
n := len(matrix)
transposed := make([][]int, n)
for i := 0; i < n; i++ {
transposed[i] = make([]int, n)
for j := 0; j < n; j++ {
transposed[i][j] = matrix[j][i]
}
}
return transposed
}
व्यावहारिकप्रयोगेषु कः एल्गोरिदम् चयनं कर्तव्यः इति आलेखस्य विरलतायाः उपलब्धस्मृतेः च उपरि निर्भरं भवति । विरल आलेखानां कृते, समीपतालिङ्कितसूचिकाः अधिकं स्मृतिकुशलाः भवितुम् अर्हन्ति;
निर्देशितं आलेखं गणयितुं जी = ( वि , ई ) ग=(वि,ई) .जी=(वि,ई) transposition of GT = ( V , ET ) G^T=(V,E^T) 1 .जीटी=(वि,ईटी), वयं क्रमशः adjacency linked list तथा adjacency matrix इत्येतयोः प्रतिनिधित्वविधयोः कृते तदनुरूपं एल्गोरिदम् दातुं शक्नुमः, तथा च तेषां चालनसमयस्य विश्लेषणं कर्तुं शक्नुमः ।
type Edge struct {
dest int
}
type AdjacencyList struct {
edges map[int][]Edge
}
func TransposeGraph(graph AdjacencyList) AdjacencyList {
transposed := AdjacencyList{edges: make(map[int][]Edge)}
for u, neighbors := range graph.edges {
for _, edge := range neighbors {
v := edge.dest
transposed.edges[v] = append(transposed.edges[v], Edge{dest: u})
}
}
return transposed
}
func main() {
// 示例图的邻接链表表示
graph := AdjacencyList{edges: map[int][]Edge{
0: {{dest: 1}},
1: {{dest: 2}},
2: {{dest: 0}},
}}
// 计算转置图
transposedGraph := TransposeGraph(graph)
// 打印转置图的邻接链表
for u, neighbors := range transposedGraph.edges {
fmt.Printf("Node %d -> Nodes: ", u)
for _, edge := range neighbors {
fmt.Printf("%d ", edge.dest)
}
fmt.Println()
}
}
अस्मिन् कोड् मध्ये वयं a इति परिभाषयामः Edge
धाराणां प्रतिनिधित्वं कर्तुं संरचना, and aAdjacencyList
समीपतालिङ्कितसूचीं प्रतिनिधितुं संरचना ।TransposeGraph
कार्यं स्वीकुर्वति कAdjacencyList
type parameter तथा च तस्य transposed graph इत्यस्य adjacency linked list representation प्रेषयति ।अस्तिmain
function, वयं उदाहरणं graph रचयामः, तस्य transposed graph इत्यस्य गणनां कृत्वा मुद्रयामः ।