Cod sursa(job #2230318)

Utilizator HeicaruDillonemil plic HeicaruDillon Data 9 august 2018 18:10:47
Problema Ciclu Eulerian Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 2.66 kb
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
FILE *f,*g;
vector < int > v[100002];
int been[100002],deg[100002];
int n,m;
void afisare_fake()
{
    for(int i=1; i<=n; i++)
    {
        for(int j=0; j<v[i].size(); j++)
            fprintf(g,"%d ",v[i][j]);
        fprintf(g,"\n");
    }
}
void read()
{
    int x,y;
    fscanf(f,"%d %d",&n,&m);
    for(int i=1; i<=m; i++)
    {
        fscanf(f,"%d %d",&x,&y);
        v[x].push_back(y);
        v[y].push_back(x);
        deg[x]++;
        deg[y]++;
    }
}
int dfs(int node, bool visited[])
{
    visited[node]=true;
    int nr=1;
    for(int i=0; i<v[node].size(); i++)
        if(!visited[v[node][i]]  && v[node][i]!=-1)
            nr+=dfs(v[node][i],visited);
    return nr;
}
void remove_edge(int node, int node2)
{
    for(int i=0; i<v[node].size(); i++)
        if(v[node][i]==node2)
        {
            v[node][i]=-1;
            break;
        }
    for(int i=0; i<v[node2].size(); i++)
        if(v[node2][i]==node)
        {
            v[node2][i]=-1;
            break;
        }
}
void add_edge(int node, int node2)
{
    for(int i=0; i<v[node].size(); i++)
        if(v[node][i]==-1)
        {
            v[node][i]=node2;
            break;
        }
    for(int i=0; i<v[node2].size(); i++)
        if(v[node2][i]==-1)
        {
            v[node2][i]=node;
            break;
        }
}
int valid(int node, int node2)
{
    int nr=0;
    for(int i=0; i<v[node].size(); i++)
        if(v[node][i]!=-1)
            nr++;
    if(nr==1)
    {
        remove_edge(node, node2);
        return 1;
    }
    bool visited[n];
    memset(visited, false, n+1);
    int nr1=dfs(node, visited);
    remove_edge(node, node2);
    memset(visited, false, n+1);
    int nr2=dfs(node, visited);
    if(nr1>nr2)
        return 0;
    return 1;

}
void euler(int node)
{
    int ok=1;
    for(int i=0; i<v[node].size(); i++)
    {
        int node2=v[node][i];
        if(node2!=-1)
        {
            if(valid(node,node2))
            {
                fprintf(g,"%d ",node2);
                cout<<node2<<" ";
                //afisare_fake();
                euler(node2);
            }
            else
                add_edge(node,node2);
        }
    }
}
int main()
{
    f=fopen("ciclueuler.in","r");
    g=fopen("ciclueuler.out","w");
    read();
    for(int i=1; i<=n; i++)
        if(deg[i]%2==1)
        {
            fprintf(g,"-1");
            return 0;
        }
    fprintf(g,"1 ");
    euler(1);
    fclose(f);
    fclose(g);
    return 0;
}