Cod sursa(job #2643310)

Utilizator alexandru-andreiCarmici Alexandru-Andrei alexandru-andrei Data 19 august 2020 14:35:32
Problema Fractii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 4.22 kb
#include <stdio.h>
	
#include <vector>
	
#include <stack>
	
#define NMAX 50005
	
using namespace std;
	
FILE *fin = fopen("domino.in", "r");
	
FILE *fout = fopen("domino.out", "w");
	
int n,i,x,y,incep,nr,nod,lat,ultimalat,sfarsit,nrc;
	
bool viz[NMAX],rotult,vizitat[10];
	
struct muchie {int inc; int sf;} arc[NMAX];
	
vector <int> g[10];
	
stack <int> stiva,ans;
	
stack <bool> rotire;
	
 
	
void DF(int i)
	
{
	
    vizitat[i]=1;
	
    for(int j=0;j<g[i].size();j++){
	
        int m;
	
        m=g[i][j];
	
        int nod;
	
        nod=arc[m].inc+arc[m].sf-i;
	
        if(vizitat[nod]==0) DF(nod);
	
    }
	
 
	
}
	
int main()
	
{
	
    fscanf(fin, "%d", &n);
	
    for(i=1; i<=n; ++i)
	
    {
	
        fscanf(fin, "%d%d", &x,&y);
	
        arc[i].inc = x;
	
        arc[i].sf = y;
	
        g[x].push_back(i);
	
       // if(x!=y)
	
        g[y].push_back(i);
	
    }
	
    for(i=0; i<=9; ++i)
	
        if(g[i].size() and g[i].size()%2)
	
            nr++;
	
    for(int i=0;i<=9;i++)
	
     if(vizitat[i]==0 and g[i].size()!=0){nrc++;DF(i);}
	
    if((nr!=0 and nr!=2)||(nrc>1))
	
        fprintf(fout, "0");
	
 
	
    else
	
    {
	
        fprintf(fout, "1\n");
	
        if(nr == 2)
	
        {
	
            for(i=0; i<=9; ++i)
	
                if(g[i].size()!=0 and g[i].size()%2)
	
                    if(!incep)
	
                        incep = i;
	
                   // else
	
                     //   sfarsit = i;
	
                //else;
	
                rotult=1;
	
                stiva.push(incep);
	
            for(i=0; i<=n; ++i)
	
               if(arc[i].inc == incep)
	
                //and arc[i].sf == sfarsit or arc[i].sf == incep and arc[i].inc == sfarsit)
	
                {
	
                    viz[i] = true;
	
 
	
                    rotire.push(0);
	
                    ans.push(i);
	
 
	
                  sfarsit=arc[i].sf;
	
                  break;
	
 
	
                }
	
                else
	
                if(arc[i].sf == incep)
	
                //and arc[i].sf == sfarsit or arc[i].sf == incep and arc[i].inc == sfarsit)
	
                {
	
                    viz[i] = true;
	
                    rotire.push(1);
	
                    ans.push(i);
	
 
	
                  sfarsit=arc[i].inc;
	
                  break;
	
 
	
                }
	
 
	
 
	
          //  if(g[incep].size() > g[sfarsit].size())
	
            //{
	
             //   stiva.push(incep);
	
              //  if(arc[ultimalat].inc == incep)
	
               //     rotult = 0;
	
              //  else
	
                    rotult = 1;
	
           // }
	
           // else
	
          //  {
	
            //    stiva.push(sfarsit);
	
             //   if(arc[ultimalat].inc == sfarsit)
	
             //   rotult = 0;
	
              //  else
	
              //  rotult = 1;
	
           // }
	
       //
	
       i=sfarsit;
	
       }
	
        else
	
        {
	
        i = 0;
	
            while(g[i].empty())
	
                ++i;}
	
 
	
 
	
    stiva.push(i);
	
  //  fprintf(fout,"%d %d\n",stiva.size(),i);
	
 
	
        while(!stiva.empty())
	
        {
	
            nod = stiva.top();
	
            if(g[nod].size())
	
            {
	
                lat = g[nod].back();
	
                g[nod].pop_back();
	
                if(!viz[lat])
	
                {
	
            if(nod == arc[lat].inc)
	
                    {
	
                        rotire.push(0);
	
                        ans.push(lat);
	
                        stiva.push(arc[lat].sf);
	
                    }
	
                    else
	
                    {
	
                        rotire.push(1);
	
                        ans.push(lat);
	
                        stiva.push(arc[lat].inc);
	
                    }
	
                    viz[lat] = true;
	
                }
	
                else;
	
            }
	
            else
	
            {
	
                if(!ans.empty())
	
                {
	
                    fprintf(fout, "%d %d\n", ans.top(),!rotire.top());
	
                    ans.pop();
	
                    rotire.pop();
	
                }
	
                stiva.pop();
	
            }
	
        }//while
	
     //   if(nr == 2)
	
        //    fprintf(fout, "%d %d", ultimalat,rotult);
	
 
	
    }
	
    fclose(fin);
	
    fclose(fout);
	
    return 0;
	
 
	
}