Cod sursa(job #2962248)

Utilizator David_PatranjelDavid Patranjel David_Patranjel Data 8 ianuarie 2023 02:27:09
Problema Flux maxim de cost minim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.86 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <unordered_map>
#include <map>
using namespace std;
struct edge_info{
    int x, y, viz;
};
vector<edge_info> edges;
unordered_map<int, vector<int>> sol;
vector<vector<pair<int, int>>> graf;
vector<int> degs;
int noNodes, noEdges, k = -1;

void citire();
void testEulerian();
void dfs(int node);

int main()
{
    citire();
    testEulerian();
    return 0;
}

void citire(){
    int x,y, l = 0;
    fstream fin("johnie.in");
    fin>>noNodes>>noEdges;

    graf.resize(noNodes + 1);
    degs.resize(noNodes + 1);
    for(int i = 0; i < noEdges; ++i){
        fin>>x>>y;
        graf[x].push_back(make_pair(y, l));
        graf[y].push_back(make_pair(x, l++));
        edge_info init_edge;
        init_edge.x = x; init_edge.y = y; init_edge.viz = false;
        edges.push_back(init_edge);
        degs[x]++; degs[y]++;
    }

    for(int i = 1; i <= noEdges; ++i){
        if(degs[i] % 2 == 1){
            graf[0].push_back(make_pair(i, l));
            graf[i].push_back(make_pair(0, l++));
            edge_info init_edge;
            init_edge.x = 0; init_edge.y = i; init_edge.viz = false;
            edges.push_back(init_edge);
        }
    }

    fin.close();
}

void testEulerian(){
    fstream fout("johnie.out");

    dfs(0);

    fout<<sol.size()<<endl;
    for(auto path:sol){
        fout<<path.second.size()<<" ";
        for(auto& node:path.second){
            fout<<node<<" ";
        }
        fout<<endl;
    }

    fout.close();
}

void dfs(int node){
    for(auto& vx:graf[node]){
        int v = vx.first; int edge_id = vx.second;
        if(!edges[edge_id].viz){
            edges[edge_id].viz = true;
            dfs(v);
        }
    }

    if(node == 0){
        k++;
    }else{
        sol[k].push_back(node);
    }
}