Cod sursa(job #1194013)

Utilizator alevasluialeHuhurez Marius alevasluiale Data 2 iunie 2014 18:11:58
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.91 kb
#include <fstream>
#include <bitset>
#include <vector>
#include <cstdlib>
#define N 100001
using namespace std;
int r[500001];
const int mod=7013;
bitset<N>v1[N];
vector <int>nd[N];
struct nr
{
    int x,y,val;
};
vector <nr> X[mod];
vector <nr>::iterator it1;
inline void adauga(int x,int y)
{
    for(it1=X[x%mod].begin();it1!=X[x%mod].end();it1++)
    {
        if(it1->x==x&&it1->y==y) {it1->val++;return;}
    }
    nr pas;
    pas.x=x;pas.y=y;pas.val=1;
    X[x%mod].push_back(pas);
}
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
inline void afisare(int nr)
{
    for(int i=1;i<=nr;i++) fout<<r[i]<<" ";
    exit(0) ;
}
inline bool fid(int nod,int it)
{
    int zum=nod%mod;
    for(it1=X[zum].begin();it1!=X[zum].end();it1++)
    {
        if(it1->x==nod&&it1->y==it&&it1->val!=0) return 1;
    }
    return 0;
}
inline void scade(int nod,int it)
{
    int zum=nod%mod;
    for(it1=X[zum].begin();it1!=X[zum].end();it1++)
    {
        if(it1->x==nod&&it1->y==it) {it1->val--;return;}
    }
}
inline void euler(int i,int nod,int nr)
{
    if(i<=nr)
    {
        for(vector <int>::iterator it=nd[nod].begin();it!=nd[nod].end();it++)
            {
                if(fid(nod,*it))
                {
                    r[i]=*it;
                    scade(nod,*it);
                    if(*it!=nod) scade(*it,nod);
                    euler(i+1,*it,nr);
                    adauga(nod,*it);if(*it!=nod) adauga(*it,nod);
                }
            }
    }
else if(v1[nod][1]&&fid(nod,1))
    {
    afisare(nr);
    }
}
int main()
{
    int n,x,y,m,i;
    fin>>n>>m;
    int nr=0;i=1;
    while(i<=m)
    {
        fin>>x>>y;
        nd[x].push_back(y);
        nd[y].push_back(x);
        nr++;
        v1[x][y]=1;
        adauga(x,y);
        if(x!=y) adauga(y,x);
        v1[y][x]=1;
        i++;
    }
    r[1]=1;
    euler(2,1,nr);
}