Cod sursa(job #2470369)

Utilizator ANDREWQACirstea Andrei Daniel ANDREWQA Data 9 octombrie 2019 09:12:55
Problema Ciclu Eulerian Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include <algorithm>
#include <fstream>
#include <iostream>
#include <vector>

using namespace std;

ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");

vector <int> v[1000];

const int NMAX = 100005, MMAX = 500005;


int x, y, i, n, m, Edge[1000][1000], usedEdge[1000][1000];


int main() {
    f >> n >> m;
    for ( i = 1; i <= m; i++ ){
        f >> x >> y;
        v[x].push_back(y);
        v[y].push_back(x);
        Edge[x][y]++;
        Edge[y][x]++;
    }
    vector <int> Stack, ans;
    for ( i = 1; i <= n; i++ ){
        if ( v[i].size() % 2 == 1 || v[i].size() == 0 ){
            g << "-1";
            return 0;
        }
    }
    Stack.push_back(1);
    while ( !Stack.empty() ){
        int node = Stack.back();
        if ( !v[node].empty() ){
            int altnod = v[node].back();
            v[node].pop_back();
            cout << node << " " << usedEdge[node][altnod] << " " << Edge[node][altnod] << "\n";
            if ( usedEdge[node][altnod] < Edge[node][altnod] && usedEdge[altnod][node] < Edge[altnod][node] ){
                usedEdge[node][altnod]++;
                usedEdge[altnod][node]++;
                Stack.push_back(altnod);
            }
        }
        else {
            Stack.pop_back();
            ans.push_back(node);
        }
    }
    for ( i = 0; i < ans.size() - 1; i++ )
        g << ans[i] << " ";






}