Fişierul intrare/ieşire:algoritm.in, algoritm.outSursăONIS 2015, Runda 1
AutorMihai NituAdăugată deThe_Viper_The_Mountain_And_The_ImpUNIBUC Impaler-009 Challenge costyv87 The_Viper_The_Mountain_And_The_Imp
Timp execuţie pe test2.5 secLimită de memorie65536 kbytes
Scorul tăuN/ADificultateN/A

Vezi solutiile trimise | Statistici

Por Costel si Algoritmul

Deşi nu e student în anul 1 la FMI, Por Costel s-a apucat să studieze Algoritmica Grafurilor. Astăzi, el învaţă despre alogritmul Bellman-Ford, care calculeaza drumurile minime de la un nod sursă (in cazul de faţă, nodul 1) la toate celelalte noduri într-un graf orientat, cu costuri pe muchii. Por Costel, folosindu-şi cunoştinţele sale minimale de informatică a reuşit să scrie următorul cod in C++ ce reprezintă o variaţie al algoritmului Bellman-Ford:

for (int i = 1; i <= n; ++i)
         d[ i ] = infinit;  		// GUITZZZ!
d[ 1 ] = 0;

bool ok = 0;

while (ok == 0)
{
     ok = 1;

     for (int i=0; i < E.size(); ++i)      		        // OINC!
     {
           if  (d[ E[i].x ] + E[i].cost < d[ E[i].y ] )
           {
                 ok = 0;
                 d[ E[i].y ] = d[ E[i].x ] + E[i].cost;  		//Îmi place porumbul!
           }
     }
}

Observăm mai multe deficienţe în codul de mai sus. Pe lângă documentaţia rudimentară, mai avem faptul că Por Costel işi reţine graful printr-un vector de muchii (vectorul E). O muchie este reţinută ca un triplet (x,y,cost) cu semnficiaţia că muchia porneşte de la x la y şi are costul cost. Dar cel mai rău probabil este faptul că programul este LENT !

Pentru că vrem ca prietenul nostru cu copite sa plece cu o părere bună despre informatică, am vrea să ia 100 de puncte cu această sursă, ba chiar să ruleze cât mai repede. Este clar că numărul de iteraţii ale while()-ului este influenţat direct de ordinea muchiilor in vectorul de muchii E.

Dându-se un graf orientat cu N noduri şi M muchii, vi se cere să afisaţi o ordonare a muchiilor astfel incât algoritmul Bellman-Ford scris de Por Costel să se termine după exact două iteraţii (adică să se intre în instrucţiunea repetitivă while() doar de două ori).

Date de intrare

În fişierul de intrare algoritm.in se va găsi pe prima linie T, numărul de teste.
Fiecare dintre cele T teste are formatul următor: pe prima linie sunt două numere N şi M, numărul de noduri, respectiv numărul de muchii din graf. Urmează M linii ce descriu muchiile, fiecare conţinând exact 3 numere a, b, c, cu semnificaţia că există o muchie de la nodul a la nodul b care are costul c.

Date de ieşire

În fişierul de ieşire algoritm.out se vor afişa T linii, fiecare cu câte M numere, a i-a linie va conţine o permutare a indicilor muchiilor, ce reprezintă ordinea în care vor apărea în vectorul E al lui Por Costel. Muchiile se consideră indexate după ordinea din fişierul de intrare (e.g. prima muchie citită este muchia cu indicele 1).

Restricţii si Precizari

  • T5
  • 1N10^5^
  • 1M2*10^5^
  • 1 ≤ costul unei muchii ≤ 10^6
  • Se garanteaza ca exista cel puţin o muchie care iese din nodul 1
  • În programul lui Por Costel, infinit e definit ca fiind mai mare ca orice număr întreg
  • Se acceptă orice soluţie care respectă cerinţa
  • Atentie! Graful poate conţine două muchii de la x la y, sau muchie de la x la x

Exemplu

algoritm.inalgoritm.out
1
4 4
1 2 1
3 4 2
2 3 3
1 3 1
1 4 2 3

Explicatie

Ordinea muchiilor in vectorul E a lui Por Costel va fi în acest caz: (1, 2, 1), (1, 3, 1), (3, 4, 2), (2, 3, 3). Se poate testa că algoritmul se va finaliza în două iteraţii. Există mai multe soluţii care ar putea fi afişate. Un alt exemplu este: 1 3 4 2.

Trebuie sa te autentifici pentru a trimite solutii. Click aici

Cum se trimit solutii?

remote content