Pagini recente » Cod sursa (job #1645517) | Cod sursa (job #2365829) | Cod sursa (job #1092747) | Cod sursa (job #654727) | Cod sursa (job #1027708)
#include<fstream>
#include<vector>
#include<algorithm>
#define NMAX 100005
//153319LU
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];
int grdint[NMAX];
int grdext[NMAX];
int loops[NMAX];
int indSol;
int nrm;
int n,m;
int aux;
void GetSolution()
{
int cNod=1;
solution[0].push_back(1);
int nextNode=1;
int found;
while(nextNode)
{
nextNode=0;
found=1;
while(found)
{
found=0;
for(int i=0;i<graph[cNod].size();++i)
{
if(graph[cNod][i]!=-1)
{
if(i+1<graph[cNod].size())
nextNode=cNod;
solution[indSol].push_back(graph[cNod][i]);
aux=cNod;
cNod=graph[cNod][i];
graph[aux][i]=-1;
found=1;
break;
}
}
}
if(nextNode)
{
solution.push_back(vector<int>());
indSol+=1;
inter[nextNode]=indSol;
cNod=nextNode;
}
}
}
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// if(Try(y,x))
{
graph[y].push_back(x);
grdint[y]+=1;
grdext[x]+=1;
}
/*else
{
graph[x].push_back(y);
grdint[x]+=1;
grdext[y]+=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);
}
}
solution.push_back(vector<int>());
GetSolution();
WriteSolution(0);
return 0;
}