Instance: Grafik tidak berarah dengan dua simpul dibedakan , dan integer .
Pertanyaan: Apakah terdapat sebuah jalan di , sehingga berpotongan jalan paling segitiga? (Untuk masalah ini, sebuah jalur dikatakan memotong segitiga jika jalur tersebut mengandung setidaknya satu sisi dari segitiga.)
cc.complexity-theory
graph-algorithms
Andras Farago
sumber
sumber
Jawaban:
Menganggap tidak ada self-tepi di .G
Untuk setiap tepi antara simpul dan v j di G , misalkan E [ i , j ] = 1 , dan E [ i , j ] = 0 jika tidak ada tepi. Hitung n × n matriks C [ i , j ] = Σ nvi vj G E[i,j]=1 E[i,j]=0 n×n , yang memberikan jumlah jalur dua-hop antara masing-masing pasangan node v i dan v j . Kemudian untuk edge antara v i dan v j dalam G menghitung D [ i , j ] = E [ i , j ] ⋅ C [ i , j ] jika tidak maka set D [ i , j ] = ∞C[i,j]=∑nk=1E[i,k]⋅E[k,j] vi vj vi vj G D[i,j]=E[i,j]⋅C[i,j] D[i,j]=∞ , Yang memberi jumlah segitiga tepi adalah bagian dari (atau tak terhingga jika tidak ada tepi). Penggandaan matriks yang diperlukan untuk menghitung biaya O ( n 3 ) (dapat dihitung lebih cepat tergantung pada tingkat G ).C O(n3) G
Sekarang hitung matriks A , sedemikian sehingga A [ i , j ] = min ( D [ i , j ] , min k ( D [ i , k ] + D [ k ,n×n A . A adalah semua jalur terpendek di DA[i,j]=min(D[i,j],mink(D[i,k]+D[k,j]−E[i,j])) A D panjang hingga dua ditambah untuk menjelaskan jalur yang melewati dua sisi beberapa segitiga.
Sekarang cukup hitung lintasan terpendek antara dan v j dalam G pada grafik baru yang A adalah matriks adjacency (tertimbang) menggunakan Dijkstra (karena semua bobot tepi positif) yaitu dan tentukan apakah A ∗vi vj G A , di mana A ∗ adalah penutupan semiring tropis (yang memberikan matriks jarak).A∗[i,j]≤k A∗
sumber