Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Python pelaksanaan algoritma Kosaraju untuk mencetak semua SCC
- dari koleksi import defaultdict
- #Kelas ini mewakili grafik yang diarahkan menggunakan perwakilan senarai adjacency
- Graf kelas:
- def __init __ (diri, bucu):
- diri.V = bucu #No. bucu
- self.graph = defaultdict (senarai) # kamus lalai untuk menyimpan grafik
- # berfungsi untuk menambahkan kelebihan pada graf
- def addEdge (diri, u, v):
- self.graph [u] .lampirkan (v)
- # Fungsi yang digunakan oleh DFS
- def DFSUtil (diri, v, dikunjungi):
- # Tandakan nod semasa sebagai dikunjungi dan cetaknya
- dikunjungi [v] = Benar
- cetak (v)
- #Recur untuk semua bucu yang berdekatan dengan bucu ini
- untuk i dalam self.graph [v]:
- jika dikunjungi [i] == Salah:
- diri.DFSUtil (i, dikunjungi)
- def fillOrder (diri, v, dilawati, tumpukan):
- # Tandakan nod semasa sebagai dilawati
- dikunjungi [v] = Benar
- #Recur untuk semua bucu yang berdekatan dengan bucu ini
- untuk i dalam self.graph [v]:
- jika dikunjungi [i] == Salah:
- self.fillOrder (i, dikunjungi, tumpukan)
- timbunan = tumpukan.lampirkan (v)
- # Fungsi yang mengembalikan terbalik (atau menukar) grafik ini
- def getTranspose (diri):
- g = Grafik (diri.V)
- # Berulang untuk semua bucu yang berdekatan dengan bucu ini
- untuk i dalam diri.gr:
- untuk j dalam self.graph [i]:
- g.addEdge (j, i)
- pulangan g
- # Fungsi utama yang mencari dan mencetak semuanya dengan kuat
- # komponen bersambung
- def printSCC (diri):
- timbunan = []
- # Tandakan semua bucu sebagai tidak dikunjungi (Untuk DFS pertama)
- dilawati = [Salah] * (diri.V)
- # Isi bucu dalam timbunan mengikut penamatnya
- # kali
- untuk i in range (self.V):
- jika dikunjungi [i] == Salah:
- self.fillOrder (i, dikunjungi, tumpukan)
- cetak (timbunan)
- # Buat graf terbalik
- gr = self.getTranspose ()
- # Tandakan semua bucu sebagai tidak dikunjungi (Untuk DFS kedua)
- dilawati = [Salah] * (diri.V)
- # Sekarang proseskan semua bucu mengikut urutan yang ditentukan oleh Stack
- semasa tumpukan:
- i = tumpukan.pop ()
- jika dikunjungi [i] == Salah:
- gr.DFSUtil (i, dikunjungi)
- cetak ("")
- # Buat graf yang diberikan dalam rajah di atas
- g = Grafik (16)
- g.addEdge (1, 0)
- g.addEdge (1, 2)
- g.addEdge (2, 1)
- g.addEdge (2, 3)
- g.addEdge (0, 4)
- g.addEdge (4, 0)
- g.addEdge (4, 5)
- g.addEdge (6, 5)
- g.addEdge (6, 7)
- g.addEdge (7, 6)
- g.addEdge (0, 7)
- g.addEdge (7, 0)
- g.addEdge (5, 9)
- g.addEdge (9, 5)
- g.addEdge (6, 9)
- g.addEdge (11, 6)
- g.addEdge (11, 7)
- g.addEdge (11, 10)
- g.addEdge (10, 11)
- g.addEdge (8, 12)
- g.addEdge (9, 13)
- g.addEdge (14, 13)
- g.addEdge (5, 12)
- g.addEdge (9, 14)
- g.addEdge (9, 15)
- cetak ("Berikut adalah komponen yang sangat berkaitan" +
- "dalam graf yang diberikan")
- g. cetakSCC ()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement