Cod sursa(job #2228803)

Utilizator HeicaruDillonemil plic HeicaruDillon Data 4 august 2018 21:13:36
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.25 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 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]++;
        if(x!=y)
            deg[y]++;
    }
}
int dfs(int node, bool visited[])
{
    visited[node]=true;
    int nr=1;
    vector<int>::iterator i;
    for(i=v[node].begin(); i!=v[node].end(); i++)
        if(!visited[*i]  && *i!=-1)
            nr+=dfs(*i,visited);
    return nr;
}
void remove_edge(int node, int node2)
{
    vector<int>::iterator i;
    for(i=v[node].begin(); i!=v[node].end(); i++)
        if(*i==node2)
        {
            *i=-1;
            break;
        }
    for(i=v[node].begin(); i!=v[node].end(); i++)
        if(*i==node)
        {
            *i=-1;
            break;
        }
}
void add_edge(int node, int node2)
{
    v[node].push_back(node2);
    v[node2].push_back(node);
}
int valid(int node, int node2)
{
    int nr=0;
    vector<int>::iterator i;
    for(i=v[node].begin(); i!=v[node].end(); i++)
        if(*i!=-1)
            nr++;
    if(nr==1)
        return 1;

    bool visited[n];
    memset(visited, false, n);
    int nr1=dfs(node, visited);
    remove_edge(node, node2);
    memset(visited, false, n);
    int nr2=dfs(node, visited);
    add_edge(node, node2);
    if(nr1>nr2)
        return 0;
    return 1;

}
void euler(int node)
{
    int ok=1;
    vector<int>::iterator i;
    for(i=v[node].begin(); i!=v[node].end(); i++)
    {
        int node2=*i;
        if(node2!=-1 && valid(node,node2))
        {
            remove_edge(node, node2);
            fprintf(g,"%d ",node2);
            cout<<node2;
            euler(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!=0)
        {
            fprintf(g,"-1");
            return 0;
        }
   // fprintf(g,"1 ");
    euler(1);
    fclose(f);
    fclose(g);
    return 0;
}