Cod sursa(job #3189389)

Utilizator Sumurduc_TeodoraSumurduc Teodora Sumurduc_Teodora Data 5 ianuarie 2024 01:40:32
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.57 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");

class graph{
private:
    int n,m,ok;
    vector<vector<pair<int,int>>> adj;
    vector<int> grad;
    vector<int> ciclu;
    vector<bool> vism;
public:
    graph(int n, int m):n(n),m(m)
    {
        adj.resize(n+1);
        grad.resize(n+1,0);
        vism.resize(m+1,false);
        ok=0;
    }
    void addAdj(int x,int y,int i)
    {
        ///cout<<x<<" "<<y<<endl;
        if(x!=y)
        {
            adj[x].push_back({y,i});
            adj[y].push_back({x,i});
            grad[x]++;
            grad[y]++;
        }
        else{
            adj[x].push_back({y,i});
            grad[x]+=2;
        }
    }
    void euler(int v)
    {
        while(adj[v].size())
        {
            int nod=adj[v].back().first;
            int i=adj[v].back().second;
            adj[v].pop_back();
            if(!vism[i])
            {
                vism[i]=true;
                euler(nod);
            }
        }
        ciclu.push_back(v);
    }
    bool isEuler()
    {
        for(int i=1;i<=n;i++)
        {
            if(grad[i]%2==1)
                return false;
        }
        return true;
    }
    void afisareCiclu()
    {
        for(int i=0;i<ciclu.size()-1;i++)
            g<<ciclu[i]<<" ";
    }
};

int main() {
    int n,m,x,y;
    f>>n>>m;
    graph graf(n,m);
    for(int i=1;i<=m;i++)
    {
        f>>x>>y;
        graf.addAdj(x,y,i);
    }
    if(graf.isEuler()==true)
    {
        graf.euler(1);
        graf.afisareCiclu();
    }
    else g<<-1<<endl;
    return 0;
}