Cod sursa(job #1150401)

Utilizator Impaler_009Mihai Nitu Impaler_009 Data 22 martie 2014 22:48:03
Problema Oypara Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
#include<fstream>
#include <vector>
#include <utility>
#include <iostream>
#include<algorithm>
#include <cstring>
#define N 1010
#define mod  1000000007
#define inf 1<<30

#define vint vector<pair<int,int> >::iterator

using namespace std;

ifstream fin ("A.in");
ofstream fout ("A.out");

int n,t,m,a,b;
vector<pair<int,int> > G[100001],V;
int viz[100001],vize[100001],lvl[100001];

struct prin
{
    int x,y,z;
}sol[100001];

bool cmp (pair <int,int> a, pair<int,int> b)
{
    return lvl[a.first] < lvl[b.first];
}

void dfs (int x, int l)
{
    viz[x] = 1;
    lvl[x] = l;

    for (vint it = G[x].begin(); it != G[x].end(); ++it)
    {
        if (!viz[it->first])
            dfs (it->first,l+1);
    }

    V.clear();

    for (vint it = G[x].begin(); it != G[x].end(); ++it)
    {
        if (!vize[it->second])
            V.push_back (*it);
    }

    sort (V.begin (), V.end(), cmp);

    while (V.size() > 1)
    {
        pair<int,int> y = V[V.size()-1];
        pair<int,int> z = V[V.size()-2];
        V.pop_back ();
        V.pop_back ();
        vize[z.second] = 1;
        vize[y.second] = 1;

        ++t;
        sol[t].x =y.first;
        sol[t].y = x;
        sol[t].z = z.first;
    }
}

int main ()
{
    freopen ("drumuri.in","r",stdin);
    freopen ("drumuri.out","w",stdout);

    scanf ("%d %d",&n,&m);

    for (int i=1; i<=m; ++i)
    {
        scanf ("%d %d",&a,&b);

        G[a].push_back (make_pair(b,i));
        G[b].push_back (make_pair(a,i));
    }

    if (m%2 == 1)
    {
        printf("0");
        return 0;
    }

    dfs (1,1);

    if (t == m/2)
    {
        printf("1\n");
        for (int i=1; i<=t; ++i)
            printf("%d %d %d\n",sol[i].x,sol[i].y,sol[i].z);
    }
    else
    {
        printf("0");
    }
}