Cod sursa(job #959485)

Utilizator tzipleatudTudor Tiplea tzipleatud Data 8 iunie 2013 13:12:18
Problema Nowhere-zero Scor 0
Compilator cpp Status done
Runda Infoarena Cup 2013 Marime 1.45 kb
#include <fstream>
#include <vector>
#include <map>
#define NM 100010

using namespace std;

ifstream f("nowhere-zero.in");
ofstream g("nowhere-zero.out");

int N, M;
double z;
int i, j;
vector<int> G[NM];
map<pair<int, int>, int> Map;
bool Viz[NM];
int D[NM];

void Euler (int nod)
{
    Viz[nod]=1;
    D[nod]++;

    for (vector<int>::iterator it=G[nod].begin(); it!=G[nod].end(); ++it)
        if (Map[make_pair(nod, *it)]==0 && Map[make_pair(*it, nod)]==0)
        {
            Map[make_pair(nod, *it)]++;
            Euler(*it);
            D[nod]++;
        }

    if (D[nod]%2)
    {
        for (vector<int>::iterator it=G[nod].begin(); it!=G[nod].end(); ++it)
            if (Map[make_pair(nod, *it)]>=1 && Map[make_pair(nod, *it)]<=4)
            {
                Map[make_pair(nod, *it)]++;
                Euler(*it);
                return;
            }
    }
}


int main ()
{
    f >> N >> M;
    for (i=1; i<=N; i++)
        f >> z >> z;

    for (i=1; i<=M; i++)
    {
        int x, y;
        f >> x >> y;
        G[x].push_back(y);
        G[y].push_back(x);
    }

    for (i=1; i<=N; i++)
        if (!Viz[i])
            Euler(i);

    for (map< pair<int, int>, int>::iterator it=Map.begin(); it!=Map.end(); ++it)
        if (it->second>0)
            g << (it->first).first << ' ' << (it->first).second << ' ' << it->second << '\n';

    f.close();
    g.close();

    return 0;
}