Module: Algoritma Dijkstra


Problem

10 /14


Algoritma Dijkstra dalam O(M logN)

Problem

Tulis atur cara yang akan mencari jarak dalam graf berwajaran tidak terarah dengan panjang tepi bukan negatif, daripada bucu yang diberikan kepada setiap bucu lain. Program ini harus pantas untuk graf jarang yang besar.

Input

Baris pertama input mengandungi nombor NUM — bilangan larian berbeza bagi algoritma Dijkstra (pada graf berbeza). Ini diikuti oleh NUM blok, setiap satunya mempunyai struktur berikut.

Baris pertama blok mengandungi dua nombor N dan M dipisahkan oleh ruang — bilangan bucu dan bilangan tepi graf. Ini diikuti oleh M garisan, setiap satu mengandungi tiga integer yang dipisahkan oleh ruang. Dua yang pertama daripadanya, antara 0 hingga N–1 setiap satu, menandakan hujung tepi yang sepadan, yang ketiga — antara 0 hingga 20000 dan menandakan panjang tepi ini. Selanjutnya, dalam baris terakhir blok, satu nombor daripada 0 hingga N–1 — puncak, jarak dari mana anda perlu mencari.

Bilangan graf berbeza dalam satu ujian NUM tidak tidak melebihi 5. Bilangan bucu tidak melebihi 60000, tepi — 200000.

Cetakan

Cetak ke output standard (skrin) NUM baris, setiap satu mengandungi Ni nombor yang dipisahkan oleh ruang — jarak dari puncak permulaan yang ditentukan bagi graf tidak berwajaran ke 0, 1, 2, dsb. bucu (ruang tambahan dibenarkan selepas nombor terakhir). Jika sesetengah bucu tidak boleh dicapai daripada satu permulaan yang ditentukan, cetak nombor 2009000999 dan bukannya jarak (ia dijamin bahawa semua jarak sebenar adalah kurang).

Contoh

# Input Output
1 1
5 7
1 2 5
1 3 2
2 3 4
2 4 3
3 4 6
0 3 20
0 4 10
1
18 0 5 2 8