La o competiție au participat N
concurenți. Fiecare dintre ei a primit un număr de concurs astfel încât să nu existe concurenți cu același număr. Numerele de concurs aparțin mulțimii {1,2,...,N}
. Din păcate, clasamentul final a fost pierdut, iar comisia își poate aduce aminte doar câteva relații între unii participanți (de genul “participantul cu numărul 3
a ieșit înaintea celui cu numărul 5
”).
Cerința
Șeful comisiei are nevoie de un clasament final și vă cere să-l ajutați determinând primul clasament în ordine lexicografică ce respectă relațiile pe care și le amintește comisia.
Date de intrare
Fișierul de intrare competitie.in
conține pe prima linie doua numere naturale nenule N
și M
, reprezentând numărul concurenților, respectiv numărul relațiilor pe care și le amintește comisia. Pe fiecare din următoarele M
linii se află câte două numere naturale nenule i
și j
, având semnificația: concurentul cu numărul de concurs i
a fost în clasament înaintea concurentului cu numărul de concurs j
.
Date de ieșire
Fișierul de ieșire competitie.out
va conține pe prima linie clasamentul sub forma unui sir de numere naturale nenule nr1
, nr2
, …, nrN
, separate prin câte un spațiu, reprezentând numerele de concurs ale concurenților, în ordine de la primul clasat la ultimul.
Restricții și precizări
1 ≤ N, M ≤ 1000
- Se garantează corectitudinea datelor de intrare și faptul ca există totdeauna o soluție.
Exemplul 1:
competitie.in
3 1 1 2
competitie.out
1 2 3
Exemplul 2:
competitie.in
4 2 2 1 3 4
competitie.out
2 1 3 4
#include <bits/stdc++.h> using namespace std; ifstream cin("competitie.in"); ofstream cout("competitie.out"); int a[1005] , b[1005] , f[1005]; int main() { int n , m; cin >> n >> m; for(int i = 1 ; i <= m ; i++) { cin >> a[i] >> b[i]; f[b[i]]++; } for (int i = 1; i <= n; i ++) { int j = 1; while(f[j]) j++; cout << j << ' '; int nr = j; f[nr] = -1; for (j = 1; j <= n; j ++) if (f[j] != -1)f[j] = 0; for (j = 1; j <= m; j ++) if (a[j] == nr) a[j] = b[j] = 0; for (j = 1; j <= m; j ++) f[b[j]]++; } return 0; }