Cod sursa(job #1936789)

Utilizator victoreVictor Popa victore Data 23 martie 2017 13:55:44
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.84 kb
#include<cstdio>
#include<vector>

using namespace std;
const int nmax=50005;

vector<int>v[nmax],st,ans;
int from[nmax],to[nmax];
bool viz[nmax];
int main()
{
    freopen("domino.in","r",stdin);
    freopen("domino.out","w",stdout);
    int n,i,u,w,max=-1,first=0;
    bool currnum=0;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        scanf("%d%d",&u,&w);
        v[u].push_back(i);
        v[w].push_back(i);
        from[i]=u;
        to[i]=w;
        if(u>max)
            max=u;
        else if(w>max)
            max=w;
    }
    for(i=1;i<=max;i++)
    {
        if(v[i].size()%2)
        {
            printf("0");
            return 0;
        }
        else if(!first&&v[i].size()!=0)
            first=i;
    }
    int nod,muchie;
    st.push_back(first);
    while(!st.empty())
    {
        nod=st.back();
        if(!v[nod].empty())
        {
            muchie=v[nod].back();
            v[nod].pop_back();
            if(!viz[muchie])
            {
                ans.push_back(muchie);
                viz[muchie]=1;
                if(nod==from[muchie])
                    st.push_back(to[muchie]);
                else
                    st.push_back(from[muchie]);
            }
        }
        else
            st.pop_back();
    }
    if(from[ans[0]]==from[ans[1]]||from[ans[0]]==to[ans[1]])
        currnum=1;
    else
        currnum=0;
    printf("1\n%d %d\n",ans[0],currnum);
    for(i=1;i<ans.size();i++)
    {
        if(currnum)
        {
            if(from[ans[i-1]]==from[ans[i]])
                currnum=0;
            else
                currnum=1;
        }
        else
        {
            if(to[ans[i-1]]==from[ans[i]])
                currnum=0;
            else
                currnum=1;
        }
        printf("%d %d\n",ans[i],currnum);
    }
}