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"); } |
English