informasi kontak saya
Surat[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Dalam representasi daftar tertaut ketetanggaan, setiap simpul bahasa inggrisnyakita Ada daftar tertaut, dan setiap node dalam daftar tertaut mewakili seorang budak bahasa inggrisnyakita Tepi awal.untuk menghitung GTG^TGT, kita perlu melintasi GGG untuk setiap sisi , dan membalikkan arah tepi, tambahkan GTG^TGT dalam daftar tertaut yang sesuai.
Jalankan implementasi bahasa:
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)
}
}
kompleksitas waktu:
Dalam representasi matriks ketetanggaan, kami menggunakan array dua dimensi untuk menyimpan informasi tepi, di mana matrix[u][v]
Menunjukkan apakah ada garis dari kamukamkamkamkamkamkamu tiba bahasa inggrisnyakita samping.untuk menghitung GTG^TGT, kita menelusuri segitiga atas (atau segitiga bawah, bergantung pada kebiasaan representasi matriks Anda) dari matriks dan membalik arah tepinya, yaitu, matrix[u][v]
Nilainya ditetapkan kematrixT[v][u]
。
Jalankan implementasi bahasa(Versi yang disederhanakan, hanya mempertimbangkan keberadaan dan tidak mempertimbangkan bobot tepi):
// 假设使用二维布尔切片表示邻接矩阵
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函数
kompleksitas waktu:
Untuk graf berarah yang diwakili oleh daftar ketetanggaan, kita dapat menambahkan simpul-simpul yang berdekatan dari setiap simpul ke daftar ketetanggaan dari simpul yang ditransposisi dari graf baru dengan menelusuri daftar ketetanggaan setiap simpul. Langkah-langkah spesifiknya adalah sebagai berikut:
Analisis kompleksitas waktu: diperlukan melintasi setiap titik pada grafik asli Bahasa Indonesia: O(|V|)HAI(∣Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: V∣) Waktu yang diperlukan untuk melintasi daftar ketetanggaan setiap simpul adalah Bahasa Indonesia: O(|E|)HAI(∣Bahasa Inggris∣) waktu, jadi kompleksitas waktu totalnya adalah Persamaan (|V| + |E|) dan (|V|)HAI(∣Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: V∣+∣Bahasa Inggris∣)。
Untuk graf berarah yang diwakili oleh matriks ketetanggaan, kita dapat memperoleh matriks ketetanggaan dari graf baru dengan melakukan transposisi matriks ketetanggaan dari graf aslinya. Langkah-langkah spesifiknya adalah sebagai berikut:
Analisis kompleksitas waktu: diperlukan melintasi matriks ketetanggaan dari grafik asli Bahasa Indonesia: O(|V|^2)HAI(∣Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: V∣2) waktu, jadi kompleksitas waktu totalnya adalah Bahasa Indonesia: O(|V|^2)HAI(∣Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: V∣2)。
Berikut ini adalah kode yang diimplementasikan dalam bahasa 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
}
Dalam representasi daftar tertaut ketetanggaan, kita dapat langsung menelusuri gambar aslinya GGGDaftar ketetanggaan setiap node kemudian ditambahkan ke grafik baru setelah membalikkan arah setiap sisi. GTG^{T}GTpada node yang sesuai.
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
}
Oleh karena itu, kompleksitas waktu totalnya adalah Persamaan (|V| + |E|) dan (|V|)HAI(∣Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: V∣+∣Bahasa Inggris∣)。
Dalam notasi matriks ketetanggaan, kita dapat membuat matriks ketetanggaan baru dan kemudian melintasi gambar aslinya GGGmatriks ketetanggaan, setiap elemen dalam matriks ( saya , j ) ( saya , j )(Saya,J)ditugaskan ke matriks baru ( j , saya ) (j , saya)(J,Saya)posisi, sehingga menyelesaikan inversi tepi.
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
}
Oleh karena itu, kompleksitas waktu totalnya adalah Bahasa Indonesia: O(|V|^2)HAI(∣Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: V∣2)。
Untuk representasi daftar tertaut ketetanggaan, kompleksitas waktu dari algoritma transpos adalah Persamaan (|V| + |E|) dan (|V|)HAI(∣Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: V∣+∣Bahasa Inggris∣), dan untuk representasi matriks ketetanggaan, kompleksitas waktu dari algoritma transpos adalah Bahasa Indonesia: O(|V|^2)HAI(∣Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: V∣2) .Dalam penerapan praktis, jika grafiknya relatif jarang (mis. Bahasa Indonesia: |E|∣Bahasa Inggris∣jauh lebih kecil dari ∣ V ∣ 2 |V|^2∣Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: V∣2 ), akan lebih efisien jika menggunakan representasi daftar tertaut ketetanggaan.Jika grafiknya padat (mis. Bahasa Indonesia: |E|∣Bahasa Inggris∣di dekat ∣ V ∣ 2 |V|^2∣Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: V∣2), maka representasi matriks ketetanggaan mungkin lebih tepat.
Dalam representasi grafik, daftar tertaut ketetanggaan dan matriks ketetanggaan merupakan metode yang umum digunakan. Daftar tertaut ketetanggaan digunakan untuk merepresentasikan graf tidak berarah dan berarah, sedangkan matriks ketetanggaan biasanya digunakan untuk merepresentasikan graf tidak berarah. Untuk transpos graf berarah, kita dapat mengoperasikan daftar tertaut ketetanggaan dan matriks ketetanggaan secara terpisah.
Untuk graf berarah yang diwakili oleh daftar tertaut ketetanggaan, transposisi graf dapat dilakukan dengan melintasi setiap titik pada graf asli dan memodifikasi sisi keluar dari graf asli menjadi sisi masuk.
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)
}
}
}
Untuk graf berarah yang diwakili oleh matriks ketetanggaan, transposisi graf dapat dilakukan dengan mengubah setiap baris dari graf asli menjadi kolom yang sesuai pada graf baru.
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)
}
}
Untuk transposisi daftar tertaut ketetanggaan, kompleksitas waktu algoritmanya adalah O(E), dengan E adalah jumlah sisi pada grafik. Hal ini karena setiap sisi perlu dilalui satu kali.
Untuk transpos matriks ketetanggaan, kompleksitas waktu algoritmanya adalah O(V^2), dengan V adalah jumlah simpul pada graf. Hal ini karena setiap elemen matriks perlu dilintasi satu kali, dan ukuran matriksnya adalah V×V.
Algoritme ini semuanya efisien dan dijalankan
Untuk mengimplementasikan algoritma untuk menghitung grafik berarah GGG transposisi dari GTG^{T}GT , kita dapat memproses dua representasi daftar tertaut ketetanggaan dan matriks ketetanggaan. Di bawah ini saya akan menjelaskan algoritma untuk kedua kasus ini dan memberikan contoh kode dalam bahasa Go.
newAdjList
Digunakan untuk menyimpan grafik yang dialihkan.adjList
。(u, v)
, tambahkan ke newAdjList[v]
tengah.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
}
Waktu berjalan dari algoritma ini adalah O(|V| + |E|), dimana |V| adalah jumlah simpul dan |E| adalah jumlah sisi. Ini karena kita perlu melintasi semua simpul dan tepi satu kali.
newAdjMatrix
Digunakan untuk menyimpan grafik yang dialihkan.adjMatrix
。adjMatrix[i][j]
, tetapkan ke 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
}
Waktu berjalan dari algoritma ini adalah O(|V|^2), dimana |V| adalah jumlah simpul. Hal ini karena kita perlu melintasi seluruh matriks ketetanggaan, dan ukuran matriks ketetanggaan adalah |V| x |V|.
Contoh kode di atas hanyalah bagian inti dari algoritma. Dalam aplikasi sebenarnya, fungsi lain seperti penanganan kesalahan, input dan output mungkin perlu ditambahkan. Selain itu, untuk menyederhanakan kode, diasumsikan tidak ada sisi yang berulang pada grafik dan nomor titik diberi nomor berurutan mulai dari 0.
Berikut ini adalah algoritma yang ditulis dalam bahasa Go untuk menghitung G^T dari grafik G, dan metode representasi matriks ketetanggaan dan daftar ketetanggaan yang sesuai juga diberikan:
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)
}
Kompleksitas waktu dari algoritma ini adalah O(V + E), dimana V adalah jumlah simpul dan E adalah jumlah sisi. Proses pembuatan graf yang ditransposisi memerlukan penelusuran semua sisi dari graf asli dan menambahkannya ke graf yang ditransposisi secara terbalik, sehingga total kompleksitas waktu sebanding dengan jumlah simpul dan sisi.
Grafik transposisi dari grafik berarah dapat diwakili oleh dua struktur data utama: daftar tertaut ketetanggaan dan matriks ketetanggaan. Di bawah ini saya akan memperkenalkan algoritma dalam dua kasus ini dan memberikan contoh kode dalam bahasa Go.
Untuk graf yang diwakili oleh daftar ketetanggaan tertaut, kita dapat melakukan transposisi graf tersebut dengan melintasi daftar ketetanggaan setiap titik dan kemudian menambahkan sisi terbalik ke setiap titik ketetanggaan. Kompleksitas waktu dari metode ini adalah O(V + E), dimana V adalah jumlah simpul dan E adalah jumlah sisi.
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
}
Untuk graf yang diwakili oleh matriks ketetanggaan, kita dapat menerapkan transpos dengan menukar baris dan kolom matriks. Kompleksitas waktu metode ini adalah 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
}
Dalam aplikasi praktis, algoritma mana yang dipilih bergantung pada ketersebaran grafik dan memori yang tersedia. Untuk graf renggang, daftar tertaut ketetanggaan mungkin lebih hemat memori; untuk graf padat, matriks ketetanggaan mungkin lebih efisien.
Untuk menghitung grafik berarah G = ( V, E ) G = ( V, E )G=(Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: V,Bahasa Inggris) transposisi dari GT = ( V, ET ) G^T = ( V, E^T )GT=(Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: V,Bahasa InggrisT), kita dapat memberikan algoritme yang sesuai untuk dua metode representasi masing-masing daftar tertaut ketetanggaan dan matriks ketetanggaan, dan menganalisis waktu berjalannya.
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()
}
}
Dalam kode ini, kami mendefinisikan a Edge
struktur untuk mewakili tepi, dan aAdjacencyList
Struktur untuk mewakili daftar tertaut kedekatan.TransposeGraph
Fungsi menerima aAdjacencyList
ketik parameter dan mengembalikan representasi daftar tertaut kedekatan dari grafik yang dialihkan.adamain
fungsi, kita membuat contoh grafik, menghitung dan mencetak grafik transposisinya.