Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //https://www.e-olymp.com/ru/problems/4371
- #pragma GCC optimize ("O3")
- #include <iostream>
- #include <cmath>
- #include <algorithm>
- #include <stdio.h>
- #include <cstring>
- #include <string>
- #include <cstdlib>
- #include <vector>
- #include <bitset>
- #include <map>
- #include <chrono>
- #include <unordered_set>
- #include <unordered_map>
- #include <numeric>
- #include <queue>
- #include <ctime>
- #include <stack>
- #include <set>
- #include <list>
- #include <deque>
- #include <iomanip>
- #include <sstream>
- #include <fstream>
- #include <stdarg.h>
- #include <utility>
- #define MAXN 1000000
- #define MOD 10000000000
- #define LOCAL
- using namespace std;
- vector <int> g[100001];
- int parent[100001] = {0};
- int rankk[100001];
- queue <int> q;
- int top[100001] = {0};
- int used[100001] = {0};
- int d[100001] = {0};
- int kol = 0;
- int make_set(int v) {
- parent[v] = v;
- rankk[v] = 0;
- kol++;
- return 0;
- }
- int find_set(int v) {
- if(v == parent[v])
- return v;
- return parent[v] = find_set(parent[v]);
- }
- int union_set(int a, int b) {
- a = find_set(a);
- b = find_set(b);
- if(a == b)
- return 0;
- kol--;
- if(rankk[a] < rankk[b])
- swap(a, b);
- parent[b] = a;
- if(rankk[a] == rankk[b])
- rank[a]++;
- return 0;
- }
- int main() {
- int i, j, x, fl, y, k, l, n, m, t, v;
- scanf("%i%i%i", &n, &m, &t);
- for(i = 1; i <= m; i++) {
- scanf("%i%i", &x, &y);
- g[x].push_back(y);
- g[y].push_back(x);
- }
- q.push(t);
- used[t] = 1;
- d[t] = 1;
- l = 0;
- k = 1;
- while(!q.empty()) {
- v = q.front();
- q.pop();
- top[++l] = v;
- for(i = 0; i < g[v].size(); i++)
- if(!used[g[v][i]]) {
- used[g[v][i]] = 1;
- d[g[v][i]] = d[v] + 1;
- k = d[g[v][i]];
- q.push(g[v][i]);
- }
- }
- reverse(top+1, top+l+1);
- for(i = 1; i <= n; i++)
- if(!used[i]) {
- used[i] = 1;
- make_set(i);
- for(j = 0; j < g[i].size(); j++)
- if(used[g[i][j]])
- union_set(i, g[i][j]);
- }
- printf("%i\n", k);
- l = 1;
- vector <int> ans;
- memset(used, 0, sizeof(used));
- ans.push_back(kol);
- for(i = k; i >= 1; i--) {
- while(l <= n && d[top[l]] == i) {
- make_set(top[l]);
- used[top[l]] = 1;
- for(j = 0; j < g[top[l]].size(); j++)
- if(used[g[top[l]][j]])
- union_set(top[l], g[top[l]][j]);
- l++;
- }
- ans.push_back(kol);
- }
- reverse(ans.begin(), ans.end());
- for(i = 0; i < ans.size(); i++) {
- if(i)
- printf(" ");
- printf("%i", ans[i]);
- }
- printf("\n");
- getchar();
- getchar();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement