Takrifan graf
Graf terdiri daripada set bucu tak kosong terhingga dan set tepi antara bucu Ia biasanya dinyatakan sebagai: G(V,E), dengan G mewakili graf dan V ialah bucu graf G. . Set, E ialah set tepi dalam graf G.
Graf terarah
Tepi berarah: Jika tepi dari bucu Vi ke Vj mempunyai arah, maka tepi ini dipanggil tepi terarah, juga dipanggil lengkok (Lengkok), diwakili oleh pasangan tertib
Graf tidak tertib
Tepi tidak berarah: Jika tepi antara bucu Vi dan Vj tidak mempunyai arah, tepi ini dipanggil tepi tidak berarah (Tepi) dan diwakili oleh pasangan tidak tertib (Vi, Vj).
Gambar ringkas
Graf mudah: Dalam struktur graf, jika tiada tepi dari bucu ke dirinya sendiri, dan tepi yang sama tidak muncul berulang kali, maka graf sedemikian dipanggil graf ringkas.
Grafik
mewakili bucu
Langkah pertama dalam mencipta kelas graf ialah mencipta kelas Vertex untuk menyimpan bucu dan tepi. Fungsi kelas ini adalah sama dengan kelas Node senarai terpaut dan pepohon carian binari. Kelas Vertex mempunyai dua ahli data: satu yang mengenal pasti bucu, dan nilai Boolean yang menunjukkan sama ada ia telah dilawati. Mereka dinamakan label dan wasVisited masing-masing.
Kami menyimpan semua bucu dalam tatasusunan, dan dalam kelas graf, mereka boleh dirujuk oleh kedudukan mereka dalam tatasusunan
mewakili kelebihan
Maklumat sebenar graf disimpan pada "tepi" kerana ia menerangkan struktur graf. Nod induk pokok binari hanya boleh mempunyai dua nod anak, tetapi struktur graf adalah lebih fleksibel.
Kami memanggil kaedah mewakili tepi graf sebagai senarai bersebelahan atau tatasusunan senarai bersebelahan. Ia akan menyimpan tatasusunan yang terdiri daripada senarai bucu bersebelahan sesuatu bucu
Rajah pembinaan
Tentukan kelas Graf seperti berikut:
Di sini kita menggunakan gelung for untuk menambah sub-tatasusunan pada setiap elemen dalam tatasusunan untuk menyimpan semua bucu bersebelahan dan memulakan semua elemen kepada rentetan kosong.
Perjalanan graf
Perjalanan mendalam-pertama
DepthFirstSearch, juga dikenali sebagai carian depth-first, dirujuk sebagai DFS.
Contohnya, jika anda mencari kunci di dalam bilik, anda boleh mulakan dari mana-mana bilik Cari sudut, meja sisi katil, katil, bawah katil, almari pakaian, kabinet TV dan lain-lain di dalam bilik satu persatu. , supaya tidak terlepas mana-mana Dead ends, selepas mencari semua laci dan kabinet penyimpanan, kemudian cari bilik sebelah.
Kedalaman carian pertama:
Carian pertama mendalam ialah melawati bucu yang belum dilawati, menandainya sebagai dilawati, dan kemudian mengakses bucu lain yang belum dilawati secara rekursif dalam senarai bersebelahan bucu awal
Tambah tatasusunan pada kelas Graf:
Fungsi carian mendalam-pertama:
Pencarian luas didahulukan
Breadth-first search (BFS) ialah kaedah carian buta yang bertujuan untuk mengembangkan dan memeriksa semua nod dalam graf secara sistematik untuk mencari hasil. Dalam erti kata lain, ia tidak mengambil kira kemungkinan lokasi hasil dan mencari keseluruhan graf dengan teliti sehingga keputusan ditemui.
Carian keluasan didahulukan bermula dari bucu pertama dan cuba melawat bucu sedekat mungkin dengannya, seperti yang ditunjukkan di bawah:
Prinsip kerjanya ialah:
1. Mula-mula cari bucu yang belum dilawati bersebelahan dengan bucu semasa dan tambahkannya pada senarai bucu yang dilawati dan baris gilir;
2. Kemudian ambil bucu v seterusnya daripada graf dan tambahkannya pada senarai bucu yang dilawati
3. Akhir sekali, tambahkan semua bucu yang belum dilawati bersebelahan dengan v pada baris gilir
Berikut ialah takrifan fungsi carian luas pertama:
Laluan terpendek
Apabila melakukan carian luas pertama, laluan terpendek dari satu bucu ke satu bucu bersambung ditemui secara automatik
Tentukan laluan
Untuk mencari laluan terpendek, anda perlu mengubah suai algoritma carian pertama keluasan untuk merekodkan laluan dari satu bucu ke bucu lain Kami memerlukan tatasusunan untuk menyimpan semua tepi dari satu bucu ke bucu seterusnya tepi tatasusunanKepada
//fungsi bfs
bfs(s) fungsi{
var baris gilir = [];
This.marked = benar;
Queue.push(s);//Tambah pada penghujung baris gilir
While(queue.length>0){
var v = queue.shift();//Alih keluar daripada kepala baris gilir
If(v == undefined){
print("Puncak yang dilawati: " v);
}
untuk setiap (var w dalam ini.adj[v]){
Jika(!ini.ditandakan[w]){
This.edgeTo[w] = v;
This.marked[w] = true;
queue.push(w);
}
}
}
}
Algoritma pengisihan topologi
Isihan topologi akan mengisih semua bucu graf terarah supaya tepi terarah menghala dari bucu sebelumnya ke bucu kemudian.
Algoritma pengisihan topologi adalah serupa dengan BFS Perbezaannya ialah algoritma pengisihan topologi tidak serta-merta mengeluarkan bucu yang dilawati Sebaliknya, ia melawati semua bucu bersebelahan dalam senarai bucu semasa tidak akan ditolak senarai itu habis dalam timbunan.
Algoritma pengisihan topologi dibahagikan kepada dua fungsi Fungsi pertama ialah topSort(), yang digunakan untuk menyediakan proses pengisihan dan memanggil fungsi tambahan topSortHelper(), dan kemudian memaparkan senarai puncak yang diisih
.Kerja utama algoritma pengisihan topologi diselesaikan dalam fungsi rekursif topSortHelper(). Akhirnya, puncak semasa ditolak ke tindanan.
//topSortHelper() fungsi
fungsi topSortHelper(v,dilawati,tindan){
dilawati[v] = benar;
untuk setiap (var w dalam ini.adj[v]){
Jika(!melawat[w]){
This.topSortHelper(dilawati[w],dilawati,tindan);
}
}
stack.push(v);
}