Pagini recente » Cod sursa (job #2934737) | Cod sursa (job #2888990) | Cod sursa (job #1576480) | Cod sursa (job #1686911) | Cod sursa (job #1028296)
#include<fstream>
#include<vector>
#include<queue>
#include<algorithm>
#define NMAX 100005
using namespace std;
FILE* f=freopen("ciclueuler.in","r",stdin);
FILE* o=freopen("ciclueuler.out","w",stdout);
vector<int> graph[NMAX];
vector<vector<int> > solution;
int inter[NMAX];
queue<int> row;
int grdint[NMAX];
int grdext[NMAX];
int loops[NMAX];
int indSol;
int nrm;
int n,m;
int aux;
void GetSolution()
{
while(!row.empty())
{
aux=row.front();
row.pop();
int ind=aux;
inter[ind]=indSol;
int found=0;
do{
found=0;
for(int i=0;i<graph[ind].size();++i)
{
if(graph[ind][i]!=-1)
{
solution[indSol].push_back(graph[ind][i]);
if(i+1<graph[ind].size()&&ind!=aux) {
row.push(ind);
}
int x=graph[ind][i];
graph[ind][i]=-1;
ind=x;
found=1;
break;
}
}
}while(found);
solution.push_back(vector<int>());
indSol+=1;
}
}
void WriteSolution(int k)
{
for(int i=0;i<solution[k].size()&&nrm<m;++i)
{
printf("%d ",solution[k][i]);
nrm+=1;
while(loops[solution[k][i]]) {
printf("%d ",solution[k][i]); loops[solution[k][i]]-=1, nrm+=1;
}
if(inter[solution[k][i]])
{
aux=inter[solution[k][i]];
inter[solution[k][i]]=0;
WriteSolution(aux);
}
}
}
int Try(int x,int y)
{
int aux1=grdint[x]+1;
int aux2=grdext[y]+1;
if(abs(aux1-grdext[x])>1)
return 0;
if(abs(aux2-grdint[y])>1)
return 0;
return 1;
}
void TranslateArc(int x, int y)
{
if(Try(x,y))
{
graph[x].push_back(y);
grdint[x]+=1;
grdext[y]+=1;
}
else
{
graph[y].push_back(x);
grdint[y]+=1;
grdext[x]+=1;
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<m;++i)
{
int x,y;
scanf("%d%d",&x,&y);
if(x==y) loops[x]+=1;
else
{
TranslateArc(x,y);
}
}
for(int i=1;i<=n;++i)
{
if(grdint[i]!=grdext[i]) {
printf("%d",-1);
return 0;
}
}
solution.push_back(vector<int>());
row.push(1);
solution[0].push_back(1);
GetSolution();
WriteSolution(0);
return 0;
}