Cod sursa(job #3187257)

Utilizator Giulian617Buzatu Giulian Giulian617 Data 28 decembrie 2023 12:11:39
Problema Ciclu Eulerian Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 kb
#include<bits/stdc++.h>
using namespace std;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
const int NMAX=100005,MMAX=500005;
int n,m;
vector<bool>used,usedEdge;
vector<int>eulerian_cycle,graph[NMAX];
struct Edge
{
    int from,to;
}edges[MMAX];
void dfs(int node)
{
    used[node]=1;
    for(int next:graph[node])
        if(!used[next])
            dfs(next);
}
bool is_eulerian()
{
    ///check for connectivity
    used.resize(n+1);
    dfs(1);
    for(int i=1;i<=n;i++)
        if(!used[i])
            return 0;

    ///check for even degrees
    for(int i=1;i<=n;i++)
        if(graph[i].size()%2)
            return 0;
    return 1;
}
void dfs_euler(int node)
{
    while(graph[node].size())
    {
        int edge_idx=graph[node].back();
        graph[node].pop_back();
        if(!usedEdge[edge_idx])
        {
            usedEdge[edge_idx]=1;
            dfs_euler(edges[edge_idx].from^edges[edge_idx].to^node);
        }
    }
    eulerian_cycle.push_back(node);
}
int main()
{
    f>>n>>m;
    for(int i=1,x,y;i<=m;i++)
    {
        f>>x>>y;
        graph[x].push_back(i);
        graph[y].push_back(i);
        edges[i].from=x;
        edges[i].to=y;
    }
    if(is_eulerian())
    {
        usedEdge.resize(m+1);
        dfs_euler(1);
        for(int i=0;i<(int)eulerian_cycle.size()-1;i++)
            g<<eulerian_cycle[i]<<' ';
    }
    else
        g<<-1;
    return 0;
}