Cło – Omówienie zadania z I etapu Olimpiady Informatycznej

Szczegółowe omówienie zadania Cło. I etap Olimpiady Informatycznej Licealistów:

Link do powyższego omówienia zadania Cło:
https://youtu.be/3J-Pe-w-oFc?t=884
Link do treści zadania Cło:
https://szkopul.edu.pl/problemset/problem/ptF7RsWMiiMdzzZWt5BKFAnT/site

Zadanie Cło pochodzi z I etapu XV Olimpiady Informatycznej:
https://szkopul.edu.pl/task_archive/oi/

Zadanie Cło wymaga zastosowania algorytmu DFS chodzenia po grafie
Jak się uczyć na podstawie tego zadania?
https://youtu.be/QgLyXYmFQeU?t=2019
———

#include <bits/stdc++.h>

int n, m;
int a, b;
int pocz, kon;
int akt;
bool znal;
bool rozwiazanie=true;

int odw[100003];
int odp[100003];
std::vector<int> graf[100003];

void DFS(int x, int pop)
{
    odw[x]=akt;
    for(int i=0; i<graf[x].size(); i++)
        if(graf[x][i]!=pop)
        {
            if(odw[graf[x][i]]==akt)
            {
                pocz=x;
                kon=graf[x][i];
                znal=true;
            }
            else
            {
                odp[graf[x][i]]=x;
                DFS(graf[x][i], x);
            }
        }
}

int main()
{
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);
    
    std::cin>>n>>m;
    for(int i=1; i<=m; i++)
    {   
        std::cin>>a>>b;
        graf[a].push_back(b);
        graf[b].push_back(a);
    }
    
    for(int i=1; i<=n; i++)
        if(odp[i]==0)
        {
            znal=false;
            ++akt;
            DFS(i, i);

            if(znal==false)
            {
                std::cout<<"NIE\n";
                return 0;
            }
            else
            {
                for(int j=0; j<graf[pocz].size(); j++)
                    if(graf[pocz][j]==kon)
                        std::swap(graf[pocz][j], graf[pocz].back());
                for(int j=0; j<graf[kon].size(); j++)
                    if(graf[kon][j]==pocz)
                        std::swap(graf[kon][j], graf[kon].back());
                
                graf[pocz].pop_back();
                graf[kon].pop_back();
                ++akt;
                odp[pocz]=kon;
                DFS(pocz, pocz);
            }
        }
    
    std::cout<<"TAK\n";
    for(int i=1; i<=n; i++)
        std::cout<<odp[i]<<'\n';
}
Kod C++ zadania Cło, który jest omówiony w powyższym filmie i który otrzymuje 100% 

Nie dodano jeszcze komentarza, rozpocznij dyskusję pierwszy.

Dodaj komentarz