Pagini recente » Cod sursa (job #2190501) | Cod sursa (job #2520413) | Cod sursa (job #772985) | Cod sursa (job #2941364) | Cod sursa (job #950123)
Cod sursa(job #950123)
// Balcau Ionut - grupa 134
// algoritmul lui Hierholzer pentru determinarea ciclului eulerian
#define NMAX 100001
#define MMAX 500001
using namespace std;
#include <vector>
#include <fstream>
#include <queue>
#include <iostream>
#include <algorithm>
#include <list>
ofstream fout("ciclueuler.out");
list<int> g[NMAX],sol;
list<int> Sol;
int grad[NMAX];
int n;
void citire(){
int m,x,y;
ifstream fin("ciclueuler.in");
fin>>n>>m;
while(m--){
fin>>x>>y;
g[x].push_back(y); ++grad[x];
g[y].push_back(x); ++grad[y];
}
}
int conex(){
bool v[NMAX];
int i;
for(i=1;i<=n;++i) v[i]=false;
queue<int> q;
q.push(1);
int s;
v[1]=true; s=1;
list<int>::iterator it;
while(!q.empty()){
int x=q.front();
q.pop();
cout<<x<<"->";
for(it=g[x].begin();it!=g[x].end();++it) if(!v[*it]){
q.push(*it);
v[*it]=true; ++s;
}
}
cout<<"s="<<s<<'\n';
if(s==n)
return 1;
else return 0;
}
int eulerian(){
for(int i=1;i<=n;++i)
if(grad[i]%2==1) return 0;
return 1;
}
void sterge(int x,int y){
list<int>::iterator it;
--grad[x]; --grad[y];
it=find(g[x].begin(),g[x].end(),y);
if(it!=g[x].end())
g[x].erase(it);
it=find(g[y].begin(),g[y].end(),x);
if(it!=g[y].end())
g[y].erase(it);
}
list<int> ciclu(int v){
list<int> s;
while( true ){
if( g[v].empty() )
break;
int w = g[v].front();
s.push_back(v);
cout<<v<<"->";
sterge(v,w);
v = w;
}
return s;
}
void euler(){
int v;
list<int> s;
s=ciclu(1);
Sol.insert(Sol.begin(),s.begin(),s.end());
for(list<int>::iterator it=Sol.begin();it!=Sol.end();it++){
v=*it;
if(!g[v].empty()){
cout<<"@"<<v<<"\n";
s=ciclu(v);
// it=Sol.erase(it);
Sol.insert(it,s.begin(),s.end());
}
}
}
int main(){
citire();
if(!conex() || !eulerian()){
fout<<"-1";
fout.close();
return 0;
}else{
euler();
for(list<int>::iterator it=Sol.begin();it!=Sol.end();it++){
fout<<*it<<' ';
}
}
}