Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- using namespace std;
- vector<vector<int>> g(20000);
- vector<vector<int>> g_reversed(20000);
- vector<int> used(20000);
- vector<int> order;
- vector<int> componenta;
- void dfs(int v){
- used[v] = 1;
- for (int i = 0; i < g[v].size(); i++){
- int curr_v = g[v][i];
- if (used[curr_v] == 0)
- dfs(curr_v);
- }
- order.push_back(v);
- }
- void dfs_reversed(int v){
- used[v] = 1;
- componenta.push_back(v);
- for (int i = 0; i < g_reversed[v].size(); i++){
- int curr_v = g_reversed[v][i];
- if (used[curr_v] == 0)
- dfs_reversed(curr_v);
- }
- }
- int main() {
- int n, m;
- cin >> n >> m;
- for (int i = 0; i < m; i++){
- int a, b;
- cin >> a >> b;
- g[a - 1].push_back(b - 1);
- g_reversed[b - 1].push_back(a - 1);
- }
- for (int i = 0; i < n; i++){
- if (used[i] == 0)
- dfs(i);
- }
- for (int i = 0; i < n; i++)
- used[i] = 0;
- int k = 1;
- vector<int> res(n);
- for (int i = 0; i < n; i++){
- int curr_v = order[n - i - 1];
- if (used[curr_v] == 0){
- dfs_reversed(curr_v);
- for (int j = 0; j < componenta.size(); j++){
- res[componenta[j]] = k;
- }
- k++;
- componenta.clear();
- }
- }
- cout << k - 1 << endl;
- for (int i = 0; i < n; i++){
- cout << res[i] << ' ';
- }
- }
- // 2 задача
- #include <iostream>
- #include <vector>
- using namespace std;
- vector<vector<int>> g(20000);
- vector<vector<int>> g_reversed(20000);
- vector<int> used(20000);
- vector<int> order;
- vector<int> componenta;
- void dfs(int v){
- used[v] = 1;
- for (int i = 0; i < g[v].size(); i++){
- int curr_v = g[v][i];
- if (used[curr_v] == 0)
- dfs(curr_v);
- }
- order.push_back(v);
- }
- void dfs_reversed(int v){
- used[v] = 1;
- componenta.push_back(v);
- for (int i = 0; i < g_reversed[v].size(); i++){
- int curr_v = g_reversed[v][i];
- if (used[curr_v] == 0)
- dfs_reversed(curr_v);
- }
- }
- int main() {
- int n, m;
- cin >> n >> m;
- for (int i = 0; i < m; i++){
- int a, b;
- cin >> a >> b;
- g[a - 1].push_back(b - 1);
- g_reversed[b - 1].push_back(a - 1);
- }
- for (int i = 0; i < n; i++){
- if (used[i] == 0)
- dfs(i);
- }
- for (int i = 0; i < n; i++)
- used[i] = 0;
- int k = 1;
- vector<int> componenta_number(n);
- vector<int> componenta_v;
- for (int i = 0; i < n; i++){
- int curr_v = order[n - i - 1];
- if (used[curr_v] == 0){
- dfs_reversed(curr_v);
- for (int j = 0; j < componenta.size(); j++){
- componenta_number[componenta[j]] = k;
- }
- componenta_v.push_back(componenta[0]);
- k++;
- componenta.clear();
- }
- }
- vector<int> f_is(k - 1); // 1 - пожарную станцию размещать не надо
- int cnt = k;
- for (int i = 0; i < n; i++){
- for (int j = 0; j < g[i].size(); j++){
- int a = i;
- int b = g[i][j];
- if (componenta_number[a] != componenta_number[b]){
- f_is[componenta_number[a] - 1] = 1;
- cnt--;
- }
- }
- }
- cout << cnt << endl;
- for (int i = 0; i < k - 1; i++){
- if (f_is[i] == 0)
- cout << componenta_v[i] + 1 << endl;
- }
- }
Add Comment
Please, Sign In to add comment