31592023-02-21 11:07:45rennHálózatjavításcpp17Futási hiba 0/5018ms32440 KiB
#include <bits/stdc++.h>
using namespace std;

#define GOTTAGOFAST cin.tie(0); ios::sync_with_stdio(0);

vector<int> path;
bool jo = false;

int r = -1;

vector<int> szinek;
vector<int> tavok;
vector<stack<int*>> pontszinek;
vector<int> korkezdesek;

int edge = 0;

void bejar(vector<vector<int>>& graf, int c)
{
    for(int& x : graf.at(c))
    {
        //cout << c << " " << x << "\n";
        //cout << "debug1\n";
        if(*pontszinek.at(x).top() == -1) // ha üres ág tagja
            continue;

        //cout << "debug2\n";
        pontszinek.at(c).push(&szinek[szinek.size()-1]);
        if(*pontszinek.at(x).top() == 0) // ha még nem volt
        {
            tavok.at(x) = tavok.at(c)+1;
            bejar(graf, x);
            if(*pontszinek.at(x).top() == -1)
                pontszinek.at(c).pop();
            
            continue;
        }
        //cout << "debug3\n";
        if(*pontszinek.at(x).top() > 1) // ha ciklusban van
        {
            jo = true;
            //cout << "debug4\n";
            if(korkezdesek[*pontszinek.at(x).top()] == -1) // ha önmagával találkozik
            {
                korkezdesek[*pontszinek.at(x).top()] = x;
                edge = x;
                //cout << "edge: " << edge << "\n";
            }
            else // ha létező "ciklussal" találkozik
            {
                //cout << "debug5\n";
                if(tavok[korkezdesek[*pontszinek.at(x).top()]] > tavok.at(x)) // ha a pont mégsem kör része
                {
                    tavok.at(x) = tavok.at(c)+1;
                    bejar(graf, x);
                }
                else
                {
                    //cout << "debug6\n";
                    if(tavok[edge] < tavok.at(x))
                        edge = x;
                    korkezdesek[*pontszinek.at(c).top()] = x;
                }
            }
            szinek.push_back(szinek.size());
            //pontszinek.at(x).push(&szinek[szinek.size()-1]);
            continue;
        }

    }

    if(korkezdesek[*pontszinek.at(c).top()] == -1)
        pontszinek.at(c).push(&r);
}

void bejar2(vector<vector<int>>& graf, int& c)
{
    path.push_back(c);
    for(int &x : graf.at(c))
    {
        if(jo) return;
        if(*pontszinek.at(x).top() == -1) continue;

        if(*pontszinek.at(x).top() == *pontszinek.at(c).top())
        {
            if(x == edge)
            {
                jo = true;
                return;
            }
            bejar2(graf, x);
            continue;
        }

        if(tavok.at(x) == tavok.at(c)+1)
        {
            path.push_back(x);
            jo = true;
            return;
        }
    }
}

int main()
{
    GOTTAGOFAST

    int n, k;
    cin >> n >> k;

    korkezdesek.resize(k+1);
    pontszinek.resize(n+1);
    
    tavok.resize(n+1);
    szinek.push_back(0);
    szinek.push_back(1);
    szinek.push_back(2);
    fill(tavok.begin(), tavok.end(), 0);
    fill(korkezdesek.begin(), korkezdesek.end(), -1);
    stack<int*> temp;
    temp.push(&szinek[0]);
    fill(pontszinek.begin(), pontszinek.end(), temp);

    vector<vector<int>> graf(n+1);
    int a, b;

    for (size_t i = 0; i < k; i++)
    {
        cin >> a >> b;
        graf[a].push_back(b);
    }

    for (int i = 1; i <= n && !jo; i++)
    {
        if(*pontszinek.at(i).top() != 0) continue;
        tavok.at(i) = 1;
        bejar(graf, i);
    }
    jo = false;
    //cout << "debug10\n";
    bejar2(graf, edge);

    cout << path.size()-1 << "\n";
    //for(auto x : pontszinek)
        //cout << *x.top() << " ";
    //cout << "\n";
    for (size_t i = 0; i < path.size()-1; i++)
    {
        cout << path.at(i) << " " << path[i+1] << "\n";
        //cout << *pontszinek.at(path.at(i)).top() << " " << *pontszinek.at(path.at(i)).top() << "\n";
    }

    return 0;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
base0/50
1Futási hiba0/03ms2060 KiB
2Futási hiba0/016ms26828 KiB
3Hibás válasz0/13ms2496 KiB
4Futási hiba0/13ms2832 KiB
5Futási hiba0/13ms3048 KiB
6Futási hiba0/14ms5788 KiB
7Futási hiba0/14ms5872 KiB
8Futási hiba0/26ms8692 KiB
9Futási hiba0/26ms8576 KiB
10Futási hiba0/24ms5788 KiB
11Futási hiba0/27ms11620 KiB
12Futási hiba0/24ms6404 KiB
13Futási hiba0/212ms17596 KiB
14Futási hiba0/29ms15036 KiB
15Futási hiba0/212ms20848 KiB
16Futási hiba0/212ms18160 KiB
17Futási hiba0/214ms23800 KiB
18Futási hiba0/218ms29272 KiB
19Futási hiba0/217ms26452 KiB
20Futási hiba0/218ms29244 KiB
21Futási hiba0/218ms29224 KiB
22Futási hiba0/217ms29588 KiB
23Futási hiba0/317ms29424 KiB
24Futási hiba0/417ms29428 KiB
25Futási hiba0/418ms29680 KiB
26Futási hiba0/417ms32440 KiB