Niestety, nie byliśmy w stanie w pełni poprawnie wyświetlić tego pliku, ponieważ nie jest zakodowany w UTF-8.
Możesz pobrać ten plik i spróbować otworzyć go samodzielnie.
#include <iostream> //#include <vector> //#include <queue> #include <bits/stdc++.h> using namespace std; // Numery platform od 0 do n - 1. // Z braku lepszego pomys�u zak�adam, �e wynik to najmniejsza wsp�lna // wielokrotno�� liczb ta�moci�g�w wychodz�cych z ka�dej platformy osi�galnej z // pierwszej (��cznie z ni�). Jak si� myl�, to nie b�dzie punkt�w. // EDIT: Sprawdzi�em r�cznie na paru przyk�adach. // Jednak si� (troch�) myl�, ale ju� za p�no. // Przeszukiwanie wszerz. Wype�nia visited[]. void BFS(vector<int> adj[], int src, bool visited[], int n) { for (int i = 0; i < n; i++) visited[i] = false; queue<int> q; q.push(src); visited[src] = true; while (!q.empty()) { int curr = q.front(); q.pop(); for (vector<int>::iterator it = adj[curr].begin(); it != adj[curr].end(); it++) { int x = *it; if (visited[x] == false) { q.push(x); visited[x] = true; } } } } int GCD(int a, int b) { int tmp; while (a % b > 0) { tmp = a % b; a = b; b = tmp; } return b; } int main() { int n; cin >> n; int *r = new int[n]; vector<int> *adj = new vector<int>[n]; for (int i = 0; i < n; i++) { cin >> r[i]; for (int j = 0; j < r[i]; j++) { int l; cin >> l; adj[i].push_back(l - 1); // Numery od 0. } } // Wyznaczenie zbioru platform osi�galnych z pierwszej. bool *visited = new bool[n]; BFS(adj, 0, visited, n); // Obliczenie LCM bool *processed = new bool[n]; // Aby nie powtarza� oblicze�. for (int k = 0; k < n; k++) processed[k] = false; int LCM = r[0]; processed[r[0]] = true; for (int i = 1; i < n; i++) if (visited[i] && r[i] != 0 && !processed[r[i]]) { LCM = LCM / GCD(LCM, r[i]) * r[i]; processed[r[i]] = true; } if (r[0] == 0) cout << 1 << endl; else cout << LCM << endl;; delete [] processed; delete [] r; delete [] visited; delete [] adj; //system("pause"); }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | #include <iostream> //#include <vector> //#include <queue> #include <bits/stdc++.h> using namespace std; // Numery platform od 0 do n - 1. // Z braku lepszego pomys�u zak�adam, �e wynik to najmniejsza wsp�lna // wielokrotno�� liczb ta�moci�g�w wychodz�cych z ka�dej platformy osi�galnej z // pierwszej (��cznie z ni�). Jak si� myl�, to nie b�dzie punkt�w. // EDIT: Sprawdzi�em r�cznie na paru przyk�adach. // Jednak si� (troch�) myl�, ale ju� za p�no. // Przeszukiwanie wszerz. Wype�nia visited[]. void BFS(vector<int> adj[], int src, bool visited[], int n) { for (int i = 0; i < n; i++) visited[i] = false; queue<int> q; q.push(src); visited[src] = true; while (!q.empty()) { int curr = q.front(); q.pop(); for (vector<int>::iterator it = adj[curr].begin(); it != adj[curr].end(); it++) { int x = *it; if (visited[x] == false) { q.push(x); visited[x] = true; } } } } int GCD(int a, int b) { int tmp; while (a % b > 0) { tmp = a % b; a = b; b = tmp; } return b; } int main() { int n; cin >> n; int *r = new int[n]; vector<int> *adj = new vector<int>[n]; for (int i = 0; i < n; i++) { cin >> r[i]; for (int j = 0; j < r[i]; j++) { int l; cin >> l; adj[i].push_back(l - 1); // Numery od 0. } } // Wyznaczenie zbioru platform osi�galnych z pierwszej. bool *visited = new bool[n]; BFS(adj, 0, visited, n); // Obliczenie LCM bool *processed = new bool[n]; // Aby nie powtarza� oblicze�. for (int k = 0; k < n; k++) processed[k] = false; int LCM = r[0]; processed[r[0]] = true; for (int i = 1; i < n; i++) if (visited[i] && r[i] != 0 && !processed[r[i]]) { LCM = LCM / GCD(LCM, r[i]) * r[i]; processed[r[i]] = true; } if (r[0] == 0) cout << 1 << endl; else cout << LCM << endl;; delete [] processed; delete [] r; delete [] visited; delete [] adj; //system("pause"); } |