Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- using i64 = long long;
- using pi32 = pair<int, int>;
- using pi64 = pair<i64, i64>;
- const int N = 1e5 + 5;
- const int oo = 0x3c3c3c3c;
- int n, nE;
- vector<int> graph[N];
- int Num[N], Low[N];
- stack<int> st;
- int Count = 0;
- vector<int> ans[N];
- void visit(int u) {
- static int time = 0;
- Low[u] = Num[u] = ++time;
- st.push(u);
- for (int v : graph[u])
- if (Num[v])
- Low[u] = min(Low[u], Num[v]);
- else {
- visit(v);
- Low[u] = min(Low[u], Low[v]);
- }
- if (Num[u] == Low[u]) {
- ++Count;
- int v;
- do {
- v = st.top(); st.pop();
- ans[Count].push_back(v);
- Num[v] = Low[v] = oo;
- } while (v != u);
- }
- }
- int main() {
- #ifdef LOCAL
- freopen("in.txt", "r", stdin);
- #else
- freopen("CJSCONNECT.inp", "r", stdin);
- freopen("CJSCONNECT.out", "w", stdout);
- #endif // LOCAL
- ios_base::sync_with_stdio(false);
- cin.tie(NULL);
- cin >> n >> nE;
- for (int i = 1; i <= nE; ++i) {
- int u, v; cin >> u >> v;
- graph[u].push_back(v);
- }
- for (int i = 1; i <= n; i++)
- if (!Num[i])
- visit(i);
- int id = 0, maxLen = 0;
- for(int i = 1; i <= Count; ++i) {
- if (maxLen < (int)ans[i].size()) {
- maxLen = ans[i].size();
- id = i;
- }
- }
- sort(ans[id].begin(), ans[id].end());
- cout << maxLen << '\n';
- for (int u : ans[id])
- cout << u << ' ';
- return 0;
- }
- // https://lqdoj.edu.vn/problem/cjsconnect
- /*==========================================================================================================================================================================================================================================================================
- #include <bits/stdc++.h>
- using namespace std;
- const int N = 1e5 + 5;
- int n, nE;
- vector<int> graph[N];
- int Num[N], Low[N];
- bool visited[N];
- stack<int> st;
- int Count = 0;
- vector<int> ans[N];
- void Tajan(int u) {
- static int time = 0;
- Num[u] = Low[u] = ++time;
- st.push(u);
- visited[u] = true;
- for (int v : graph[u]) {
- if (Num[v] == -1) {
- Tajan(v);
- Low[u] = min(Low[u], Low[v]);
- }
- else if(visited[v])
- Low[u] = min(Low[u], Num[v]);
- }
- if (Num[u] == Low[u]) {
- ++Count;
- int v;
- do {
- v = st.top(); st.pop();
- ans[Count].push_back(v);
- visited[v] = false;
- } while (v != u);
- }
- }
- void solve() {
- for (int i = 1; i <= n; i++) {
- Num[i] = Low[i] = -1;
- visited[i] = false;
- }
- for (int i = 1; i <= n; i++)
- if(Num[i] == -1)
- Tajan(i);
- int id = 0, maxLen = 0;
- for(int i = 1; i <= Count; ++i) {
- if (maxLen < (int)ans[i].size()) {
- maxLen = ans[i].size();
- id = i;
- }
- }
- sort(ans[id].begin(), ans[id].end());
- cout << maxLen << '\n';
- for (int u : ans[id])
- cout << u << ' ';
- }
- int main() {
- #ifdef LOCAL
- freopen("in.txt", "r", stdin);
- #else
- freopen("CJSCONNECT.inp", "r", stdin);
- freopen("CJSCONNECT.out", "w", stdout);
- #endif
- ios_base::sync_with_stdio(false);
- cin.tie(NULL);
- cin >> n >> nE;
- for (int i = 1; i <= nE; ++i) {
- int u, v; cin >> u >> v;
- graph[u].push_back(v);
- }
- solve();
- return 0;
- }
- */
Add Comment
Please, Sign In to add comment