Cod sursa(job #1505233)

Utilizator akaprosAna Kapros akapros Data 18 octombrie 2015 21:59:53
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 3.42 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <deque>
#include <vector>
#define f first
#define s second
#define maxC 10
using namespace std;
int n, i, j, x, y, z, a, b, ok, nr, l[maxC];
vector < pair < int, int> > V[maxC];
deque < pair < int, int> > q;
bool vis[maxC];
int w[maxC];
class InputReader
{
public:
    InputReader() {}
    InputReader(const char *file_name)
    {
        input_file = fopen(file_name, "r");
        cursor = 0;
        fread(buffer, SIZE, 1, input_file);
    }
    inline InputReader &operator >>(int &n)
    {
        while(buffer[cursor] < '0' || buffer[cursor] > '9')
        {
            advance();
        }
        n = 0;
        while('0' <= buffer[cursor] && buffer[cursor] <= '9')
        {
            n = n * 10 + buffer[cursor] - '0';
            advance();
        }
        return *this;
    }
private:
    FILE *input_file;
    static const int SIZE = 1 << 17;
    int cursor;
    char buffer[SIZE];
    inline void advance()
    {
        ++ cursor;
        if(cursor == SIZE)
        {
            cursor = 0;
            fread(buffer, SIZE, 1, input_file);
        }
    }
};
void read()
{
    InputReader cin("domino.in");
    cin >> n;
    memset(vis, 1, sizeof(vis));
    for (i = 1; i <= n; ++ i)
    {
        cin >> x >> y;
        vis[x] = vis[y] = 0;
        w[x] = i + n;
        w[y] = i;
        V[x].push_back(make_pair(y, i));
        V[y].push_back(make_pair(x, i + n));
    }
    for (i = 0; i < maxC; ++ i)
        l[i] = V[i].size();
}
void dfs(int x)
{
    int i;
    vis[x] = 1;
    for (i = 0; i < l[x]; ++ i)
        if (!vis[V[x][i].f])
            dfs(V[x][i].f);
}
void solve()
{
    int p = 0;
    for (b = 0; b < maxC; ++ b)
        if (l[b])
        {
            ok = 1;
            p = 0;
            memset(vis, 0, sizeof(vis));
            dfs(b);
            for (i = 1; i < maxC; ++ i)
                if ((l[i] % 2 && p) || (!vis[i] && w[i]))
                {
                    ok = 0;
                    if (b == 9)
                        return ;
                }
                else if (l[i] % 2)
                {
                    ++ p;
                    if (i == b)
                        -- p;
                }
            if (ok)
                return;
        }
}
void write()
{
    freopen("domino.out", "w", stdout);
    if (!ok)
    {
        printf("0");
        return ;
    }
    printf("1\n");
    ok = 0;
    q.push_back(make_pair(b, w[b]));
    while (!q.empty())
    {
        x = q.front().f;
        z = q.front().s;
        if (V[x].size() == 0)
        {
            q.pop_front();
            ++ nr;
            if (nr > n)
                return ;
            if (z <= n)
                printf("%d %d\n", z, 1);
            else
                printf("%d %d\n", z - n, 0);
        }
        else
        {
            y = V[x].back().f;
            z = V[x].back().s;
            if (V[y].size())
            {
                if (z <= n)
                    V[y].erase(find(V[y].begin(), V[y].end(), make_pair(x, z + n)));
                else
                    V[y].erase(find(V[y].begin(), V[y].end(), make_pair(x, z - n)));
            }
            V[x].pop_back();
            q.push_front(make_pair(y, z));
        }
    }
}
int main()
{
    read();
    solve();
    write();
    return 0;
}