10922022-03-01 00:46:36peti1234Hálózatjavításcpp14Elfogadva 50/5026ms8048 KiB
#include <bits/stdc++.h>

using namespace std;
const int c=10005;
int n, m, ki[c], id[c], h, kezd, maxi, k[c];
vector<int> sz[c], sz2[c], kor;
bool v[c], v2[c], rossz[c];
void dfs(int a) {
    // kicsit trukkos algoritmus a kor keresesehez
    v[a]=true;
    for (auto x:sz[a]) {
        if (rossz[x]) continue;
        if (!v[x]) dfs(x);
        else kor.push_back(x);

        kor.push_back(a);
        return;
    }
}
int t(int a, int b) {
    // tavolsag a koron belul
    return (a<=b ? b-a : n+b-a);
}
int p(int a) {
    return (a<h ? a+1 : 1);
}
void dfs2(int a) {
     // az igazi melysegi bejaras a kor csucsaibol indulva
     // a mar korabban bejart csucsokbol nem szabad tovabbmenni, de a maximumhoz figyelembe kell venni az ottani eredmeny
    if (id[a] && t(kezd, id[a])>t(kezd, maxi)) maxi=id[a];

    if (v2[a]) return;
    v2[a]=true;
    for (auto x:sz[a]) {
        // szerencsere nincs tobbszoros el, ezert lehet igy ellenorizni, hogy az el a koron kivul van
        if (id[a] && id[x] && p(id[a])==id[x]) continue;

        dfs2(x);
    }
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cin >> n >> m;
    for (int i=1; i<=m; i++) {
        int a, b;
        cin >> a >> b;
        sz[a].push_back(b);
        sz2[b].push_back(a);
    }

    // a kor kereseshez kell, elhagyom azokat a csucsokat, amibol nem megy ki el
    queue<int> q;
    for (int i=1; i<=n; i++) {
        ki[i]=sz[i].size();
        if (!ki[i]) q.push(i);
    }
    while (q.size()>0) {
        int a=q.front();
        rossz[a]=1;
        q.pop();
        for (auto x:sz2[a]) {
            ki[x]--;
            if (!ki[x]) q.push(x);
        }
    }

    for (int i=1; i<=n; i++) {
        if (!rossz[i]) {
            dfs(i);
            break;
        }
    }
    while (kor.back()!=kor[0]) kor.pop_back();
    reverse(kor.begin(), kor.end());
    h=kor.size();
    h--;
    for (int i=1; i<=h; i++) {
        // egy csucsrol igy lehet gyorsan eldonteni, hogy hol van a koron belul
        id[kor[i]]=i;
    }
    // a kor vektorban vannak a kornek a csucsai sorban, 1-tol indexelve (kor[0]=kor[h] de kor[0]-erteke igazabol nem szamit)


    for (int i=1; i<=h; i++) {
        kezd=i, maxi=i;
        // kezd-bol indul a bejaras, es maxi a legjobb, amit el lehet erni
        dfs2(kor[i]);
        int s=kezd;
        while (s!=maxi) {
            // n^2, ami nem optimalis, de eleg gyors
            k[s]=1;
            s=p(s);
        }
    }

    // k-ban van a megoldas, egy el akkor jo, ha k[i]=0
    int db=0;
    for (int i=1; i<=h; i++) {
        if (!k[i]) {
            db++;
        }
    }
    cout << db << "\n";
    for (int i=1; i<=h; i++) {
        if (!k[i]) {
            cout << kor[i] << " " << kor[p(i)] << "\n";
        }
    }
    return 0;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
base50/50
1Elfogadva0/02ms2756 KiB
2Elfogadva0/09ms5552 KiB
3Elfogadva1/12ms3024 KiB
4Elfogadva1/12ms3044 KiB
5Elfogadva1/12ms3036 KiB
6Elfogadva1/12ms3324 KiB
7Elfogadva1/13ms3336 KiB
8Elfogadva2/23ms3636 KiB
9Elfogadva2/23ms3644 KiB
10Elfogadva2/22ms3396 KiB
11Elfogadva2/24ms4000 KiB
12Elfogadva2/23ms3492 KiB
13Elfogadva2/29ms4764 KiB
14Elfogadva2/24ms4432 KiB
15Elfogadva2/213ms5204 KiB
16Elfogadva2/26ms5016 KiB
17Elfogadva2/216ms5676 KiB
18Elfogadva2/28ms6444 KiB
19Elfogadva2/28ms6260 KiB
20Elfogadva2/221ms6748 KiB
21Elfogadva2/28ms6936 KiB
22Elfogadva2/221ms7092 KiB
23Elfogadva3/38ms7308 KiB
24Elfogadva4/48ms7476 KiB
25Elfogadva4/48ms7612 KiB
26Elfogadva4/426ms8048 KiB