Pagini recente » Cod sursa (job #2068158) | Cod sursa (job #1204750) | Istoria paginii runda/5_martie_simulare_oji_2024_clasele_11_12 | Statistici Vlad Butnaru (vlad_butnaru) | Cod sursa (job #952953)
Cod sursa(job #952953)
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
#include <queue>
#include <string.h>
using namespace std;
const static int maxnr_noduri = 100001;
int nr_noduri , nr_muchii;
vector <int> graph[maxnr_noduri+1];
vector <int> answer;
stack <int> stiva;
int gradintrare[maxnr_noduri+1];
int gradiesire[maxnr_noduri+1];
bool este_conex(const int & start)
{
int nod = start;
queue <int> coada;
coada.push(nod);
bool * select = new bool[nr_noduri+1];
memset(select , false , sizeof(select));
while (!coada.empty())
{
nod = coada.front();
coada.pop();
select[nod] = true;
for (int i = 0;i<graph[nod].size();i++)
if (!select[graph[nod][i]]) coada.push(graph[nod][i]);
}
bool ok = true;
for (int i = 1;i<=nr_noduri;i++)
if (!select[nr_noduri])
{
ok = false;
break;
}
delete[] select;
return ok;
}
bool este_eulerian()
{
for (int i = 1;i<=nr_noduri;i++)
if ((gradintrare[i] + gradiesire[i]) % 2 == 1) return false;
return true;
}
int delete_edge(const int & nod1 , const int & nod2)
{
graph[nod1].erase(graph[nod1].begin());
vector<int>::iterator it;
for (it = graph[nod2].begin();it != graph[nod2].end();it++)
{
if (*it == nod1)
{
graph[nod2].erase(it);
break;
}
}
}
void euler(int nod)
{
do{
int pnod = nod;
while(!graph[pnod].empty())
{
int aux = graph[pnod].front();
stiva.push(pnod);
delete_edge(pnod , aux);
pnod = aux;
}
nod = stiva.top();
stiva.pop();
answer.push_back(nod);
}while ( !stiva.empty() );
}
void read_data()
{
ifstream input("ciclueuler.in");
input >> nr_noduri >> nr_muchii;
int a , b ;
for (int i = 0;i<nr_muchii;i++)
{
input >> a >> b;
graph[a].push_back(b);
graph[b].push_back(a);
gradiesire[a]++;
gradintrare[b]++;
}
input.close();
}
int main()
{
ofstream output("ciclueuler.out");
read_data();
if (!este_conex(1) || !este_eulerian() )
{
output << "-1";
return 0;
}
euler(1);
for (int i = answer.size()-1;i>=0;i--)
output << answer[i] << " ";
return 0;
}