78172024-01-11 11:40:22TuruTamasHálózatjavításcpp17Time limit exceeded 24/50400ms5260 KiB
#include <bits/stdc++.h>
using namespace std;

#ifdef DEBUG
ifstream in_file("minta/be2.txt");
#define input in_file
#define INTHENAMEOFGOD
#else
#define input cin
#define INTHENAMEOFGOD \
    ios::sync_with_stdio(0); \
    cin.tie(0); \
    cout.tie(0);
#endif
typedef long long ll;
typedef vector<ll> vi;
typedef vector<vi> vvi;
typedef vector<bool> vb;
typedef pair<ll, ll> pii;

ll N, M, a, b, visszacsat, kezdet;
vvi G;
vector<pii> kor;
vector<char> vis;
bool found;

void dfs1(ll x) {
    vis[x] = 1;
    for (ll next : G[x]) {
        if (!vis[next]) {
            dfs1(next);
            if (found) {
                kor[x] = {next, 0};
                return;
            }
        }
        if (vis[next] == 1) {
            kor[x] = {next, 0};
            visszacsat = next;
            found = true;
            return;
        }
    }
    vis[x] = 2;
}

void korbejar(ll tol, ll ig) {
    ll most = tol;
    while (most != ig) {
        kor[most].second++;
        most = kor[most].first;
    }
}

void dfs2(ll x) {
    vis[x] = 1;
    for (ll next : G[x]) {
        if (kor[next].first != -1 && next != kor[x].first) {
            korbejar(next, kezdet);
            continue;
        }
        if (kor[next].first == -1 && !vis[next]) {
            dfs2(next);
        }
    }
}

int main() {
    input >> N >> M;
    G.resize(N);
    for (ll m = 0; m < M; m++) {
        input >> a >> b;
        a--; b--;
        G[a].push_back(b);
    }

    kor.assign(N, {-1, -1});
    vis.assign(N, 0);
    for (ll i = 0; !found; i++) {
        assert(i < N);
        dfs1(i);
    }

    vis.assign(N, 0);
    for (ll n = 0; n < N; n++) {
        if (kor[n].first != -1) {
            kezdet = n;
            dfs2(n);
        }
    }

    ll maxfok = max_element(kor.begin(), kor.end(), [](pii a, pii b) {
        return a.second < b.second;
    })->second;

    ostringstream os("");
    ll db = 0;

    for (ll n = 0; n < N; n++) {
        if (kor[n].first != -1 && kor[n].second == maxfok) {
            db++;
            os << n+1 << " " << kor[n].first+1 << "\n";
        }
    }
    cout << db << "\n" << os.str() << endl;
}
SubtaskSumTestVerdictTimeMemory
base24/50
1Accepted0/03ms1812 KiB
2Time limit exceeded0/0400ms2428 KiB
3Accepted1/13ms2236 KiB
4Accepted1/13ms2240 KiB
5Time limit exceeded0/1400ms1672 KiB
6Accepted1/16ms2516 KiB
7Accepted1/16ms2776 KiB
8Accepted2/217ms3244 KiB
9Accepted2/217ms3456 KiB
10Accepted2/24ms3144 KiB
11Accepted2/248ms3916 KiB
12Accepted2/26ms3364 KiB
13Accepted2/2125ms4520 KiB
14Accepted2/293ms4244 KiB
15Accepted2/2180ms4908 KiB
16Accepted2/2155ms4608 KiB
17Accepted2/2254ms5260 KiB
18Time limit exceeded0/2354ms3692 KiB
19Time limit exceeded0/2349ms3460 KiB
20Time limit exceeded0/2352ms3712 KiB
21Time limit exceeded0/2377ms3580 KiB
22Time limit exceeded0/2365ms3644 KiB
23Time limit exceeded0/3349ms3636 KiB
24Time limit exceeded0/4372ms3596 KiB
25Time limit exceeded0/4381ms3740 KiB
26Time limit exceeded0/4349ms3860 KiB