Mengonversi digraf ke grafik tidak berarah dengan cara yang dapat dibalik

10

Saya mencari sebuah algoritma untuk mengubah digraf (grafik berarah) menjadi grafik tidak terarah dengan cara yang dapat dibalik, yaitu digraf harus direkonstruksi jika kita diberi grafik yang tidak terarah. Saya mengerti bahwa ini akan menyebabkan grafik yang tidak diarahkan memiliki lebih banyak titik tetapi saya tidak keberatan.

Apakah ada yang tahu bagaimana melakukan ini atau dapat menyarankan referensi? Terima kasih sebelumnya.


Pembaruan: Mengenai jawaban AdrianN di bawah ini. Ini mungkin merupakan titik awal yang baik tetapi saya tidak berpikir itu berfungsi dalam bentuk saat ini. Berikut ini adalah gambaran mengapa saya pikir itu tidak: masukkan deskripsi gambar di sini


Pembaruan setelah komentar DW: Saya menganggap simpul grafik tidak berlabel. Jika suatu solusi melibatkan pelabelan simpul (seperti yang dilakukan AdrianN), maka solusi tersebut harus memberikan grafik yang tidak terarah (isomorfik) yang sama tidak peduli bagaimana pelabelan dilakukan. Definisi saya tentang "isomorfik" untuk grafik dengan simpul berlabel adalah bahwa ada permutasi dari pelabelan yang menghubungkan dua grafik, tetapi saya tidak yakin dengan definisi yang tepat untuk grafik yang tidak berlabel ...

Heterotik
sumber
1
Saya pikir pertanyaan ini terlalu luas. Apa kendala Anda?
adrianN
Saya tidak bisa memikirkan kendala apa pun untuk saat ini. Saya kira cara apa pun untuk menyandikan informasi dari grafik berarah menjadi grafik yang tidak terarah akan dilakukan, asalkan itu reversibel. Saya kira apa yang ada dalam pikiran saya adalah jenis paling sederhana dari grafik tidak berarah, jadi saya mencari solusi yang tidak menggunakan warna baik untuk simpul maupun tepi.
Heterotik
Saya pikir Anda harus menentukan dalam pertanyaan apa yang Anda maksud dengan "grafik yang sama". Apakah maksud Anda bahwa simpul diberi label, atau bahwa simpul tidak berlabel? Apakah maksud Anda sama untuk keduanya, atau kedua grafik itu isomorfis? Sepertinya Anda maksud yang terakhir. Apakah Anda yakin itu persyaratan dalam aplikasi Anda? Jika Anda diizinkan mempertahankan label, masalahnya menjadi lebih mudah dan jawaban AdrianN berfungsi (karena edge tidak sama dengan edge ). ( 3 , 4 ) ( 1 , 2 )(V,E)(3,4)(1,2)
DW
2
Harap sertakan pembaruan Anda ke dalam pertanyaan. Kapan pun, pos SE harus dapat dibaca dari atas ke bawah tanpa bertanya-tanya tentang riwayat; itu diarsipkan secara terpisah.
Raphael

Jawaban:

6

Untuk setiap tepi terarah , tambahkan simpul baru dan ganti dengan edge , , , , , .e=(x,y) e x v e 1 v e 1 v e 2 v e 1 v e 3 v e 3v1e,,v5eexv1ev1ev2ev1ev3e v e 4 v e 5 v e 3 yv3ev4ev4ev5ev3ey

Untuk memecahkan kode, setiap daun (derajat-1 simpul) yang tetangganya memiliki derajat 2 harus  untuk beberapa tepi ; tetangganya adalah  dan tetangga lain dari  adalah  .  memiliki tetangga unik yang memiliki derajat 3 dan berdekatan dengan daun: tetangga adalah  dan daunnya  (jika memiliki dua tetangga daun, pilih satu dengan sewenang-wenang menjadi ). Tetangga lain dari adalah  dan tetangga lain dari adalah  . Kembalikan tepi yang diarahkan e = ( x , y ) v e 4 v e 4 v e 3 v e 3 v e 1 v e 2 v e 1 v e 2 v e 1 x v e 3 y ( x , y ) v e 1 , ... , v e 5v5ee=(x,y)v4ev4ev3ev3ev1ev2ev1ev2ev1exv3ey(x,y) dan hapus simpul .v1e,,v5e

David Richerby
sumber
7

Jawaban David Richerby (yang diterima) bagus.

Saya mengikuti instruksinya pada contoh digraf yang sederhana, dan berharap itu membantu seseorang.

digraf a <-> b, c -> a, b -> c

(Saya akan memposting ini sebagai komentar atas jawaban David, tetapi saya tidak memiliki poin reputasi yang diperlukan.)

William
sumber
1
Representasi grafis adalah peningkatan besar atas jawaban aslinya. Terima kasih telah mempostingnya sebagai jawaban, bukan komentar.
OrangeSherbet
1
Saya selalu merasa kewalahan ketika saya melihat penjelasan formal atau formula dalam makalah matematika. Saya hanya harus mengatasi kecemasan itu, dan melihat setiap kalimat perlahan-lahan - mencari hal-hal yang saya tidak kenal ketika saya melanjutkan. Lalu saya mencoretkan contoh seperti ini untuk memastikan saya mengerti. Pada akhirnya saya selalu tercengang melihat betapa sederhananya itu semua panjang, dan agak ngeri tentang betapa sulitnya usaha yang saya butuhkan untuk memahaminya. Rasanya aku kadang-kadang dari planet yang berbeda. Senang saya bisa membantu Anda memahaminya lebih cepat. Setelah Anda melihatnya, itu mudah.
William
2

Untuk mengonversi grafik berarah ke grafik tak berarah lakukan hal berikut:GDG

  1. Beri nomor pada simpulD
  2. Buat dua graf tidak berarah , pada simpul yang sama denganG DGD
  3. Untuk setiap tepi , di tambahkan tepi ke jika , tambahkan tepi keuvDGu<vG
  4. G adalah persatuan terpisah dari danGG

Ketika melakukan persatuan yang terpisah, seseorang harus berhati-hati untuk membuatnya dapat dibalik.

Contoh

adrianN
sumber
Ini adalah upaya yang bagus dan ini sesuai dengan yang saya pikirkan untuk sebuah jawaban tetapi tidak berhasil karena kebalikannya tidak unik. Misalnya, grafik O <-> OOO akan dikonversi ke grafik OO OO OO OO tetapi kemudian yang terakhir ini bisa juga berasal dari grafik yang diarahkan O-> O O-> OOO, sehingga prosesnya tidak dapat dibalik.
Heterotik
Saya menambahkan gambar untuk membuatnya lebih jelas.
adrianN
-1

Bagaimana dengan fungsi identitas? Yaitu setiap digraf dapat dilihat sebagai grafik bipartit yang tidak terarah dengan partisi berukuran sama dan sebaliknya.

muede
sumber
Saya berasumsi Anda bermaksud mengkode digraf dengan grafik . Itu tidak berhasil karena, ia tidak dapat mengatasi tepi dua arah dan, jika adalah hasil dari membalikkan semua tepi dalam , maka dan memiliki pengkodean isomorfik tetapi tidak harus isomorfik sendiri. G=(V,E)(V×{0,1},{(u,0,v,1)(u,v)E})GGGG
David Richerby
-1

Inilah tikaman di ini:

Ganti informasi arah dengan simpul tambahan di grafik yang tidak diarahkan. Dengan kata lain, gunakan simpul tambahan di grafik yang tidak diarahkan untuk "menyandikan" informasi arah. Misalnya, untuk setiap simpul langsung dengan setidaknya satu tepi, tambahkan sejumlah simpul tidak berarah sama dengan 1 + jumlah tepi "masuk". Vertikal dengan nol tepi tetap tidak berubah.

Untuk melakukan arah sebaliknya, buat simpul diarahkan untuk setiap simpul yang memiliki 0 atau lebih dari 1 tepi. (Verteks dengan tepat satu tepi adalah simpul "arah pengkodean"). Setiap tepi yang menghubungkan titik multi-bermata lain adalah koneksi dalam grafik yang diarahkan. Sekarang adalah bagian yang sulit yang saya tidak bisa jelaskan tentang algoritme untuk (tapi saya rasa ada): Anda harus menyimpulkan arah panah yang diberikan hanya jumlah panah yang masuk untuk setiap titik.

Saya pikir bagian yang sulit adalah seperti bermain kapal penyapu ranjau :-) Cari tahu di mana bom (tepi masuk) diberi jumlah bom yang berdekatan untuk setiap kotak (titik).

Harun
sumber
Apa itu "vertex terarah"? Bagaimanapun, ini tidak dapat diuraikan secara unik. Misalkan sebuah simpul memiliki sekelompok simpul derajat-1 yang melekat padanya, bersama dengan sekelompok simpul derajat lainnya. Bagaimana Anda tahu berapa banyak dari mereka yang mewakili tepi yang masuk dari simpul derajat 1 dan berapa banyak yang mengkodekan dalam derajat ? Dalam kasus apa pun, menyelesaikan Minesweeper adalah NP-hard, solusinya tidak selalu unik dan tidak jelas bahwa itu bisa diselesaikan sama sekali ketika kotak tidak harus diatur dalam kotak yang bagus. xx
David Richerby
Dengan "vertex terarah", yang saya maksud adalah vertex dalam grafik terarah (sebagai lawan dari grafik non-terarah setara) Anda dapat membedakan tepi "nyata" dari "tepi pengkodean" karena hanya simpul "pengkodean derajat" yang memiliki satu tepi. Itulah alasan "1 +" dalam uraian saya. Saya akan mengambil kata-kata Anda tentang "bagian rumit" kecil. Saya tidak tahu bahwa itu persis sama dengan kapal penyapu ranjau, tapi saya bisa percaya bahwa saya mungkin hanya menendang ember di jalan :-)
Aaron
Juga, saya tidak begitu mengerti solusi Anda ketika saya pertama kali membacanya, tetapi saya melihat cara kerjanya sekarang. Pintar!
Aaron
Biarkan menjadi simpul dalam grafik asli yang tidak memiliki tepi masuk dan tepat satu tepi keluar. Dalam grafik kode, muncul sebagai simpul dengan tepat satu tepi keluar darinya. Bagaimana Anda membedakan semacam itu derajat-1 dari jenis derajat-1 yang kode dalam derajat? xx
David Richerby
Saya pikir ini "minesweeper-moot" sekarang, tetapi ide saya adalah untuk mengambil ujung terarah dan mengubahnya menjadi dan . Jadi akan memiliki dua tepi, bukan 1. Setiap simpul yang hanya memiliki 1 tepi adalah pengkodean derajat. memiliki dua simpul kode derajat, menunjukkan derajat 1. Dalam contoh sederhana ini, penguraian kode mudah karena kita tahu hanya ada dua simpul, dan mereka memiliki derajat 0 dan 1, masing-masing, sehingga( x 0 , x ) , ( x , y ) , ( y , y 0 ) ( y , y 1 ) x y ( x , y )(x,y)(x0,x),(x,y),(y,y0)(y,y1)xy(x,y)
Aaron