Pagini recente » Cod sursa (job #2057850) | Cod sursa (job #448055) | Cod sursa (job #2376739) | Cod sursa (job #2987040) | Cod sursa (job #726337)
Cod sursa(job #726337)
#include<fstream>
#include<vector>
using namespace std;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
#define lung 500001
int n,m,st[lung],grad[lung];
queue<int> Q;
vector< pair<int,int> > G[Nmax];
bool viz[lung];
void read()
{ fscanf(f,"%d%d",&N,&M);
int i,x,y;
for(i=1;i<=M;++i)
{
fscanf(f,"%d%d",&x,&y);
G[x].push_back(make_pair(y,i));
G[y].push_back(make_pair(x,i));
++gr[x];
++gr[y];
}
fclose(f);
}
void df(int x)
{
viz[x] = true;
for(vector< pair<int,int> >::iterator it = G[x].begin();it!=G[x].end();++it)
if(viz[it->first] == false)
df(it->first);
}
void euler()
{
st[++st[0]] = 1;
viz.reset();
int nod,vec,ind;
while(st[0])
{
nod = st[st[0]];
if(G[nod].size() == 0)
{
Q.push(nod);
--st[0];
continue;
}
vec = (G[nod].end()-1)->first;
ind = (G[nod].end()-1)->second;
G[nod].pop_back();
if(viz[ind] == false)
{
viz[ind] = true;
st[++st[0]] = vec;
}
}
}
int main()
{int i,x,y;
fin >> n >> m;
for(i=1;i<=m;++i)
{ fin >> x >> y;
G[x].push_back(make_pair(y,i));
G[y].push_back(make_pair(x,i));
++gr[x];
++gr[y];
}
df(1);
int ok = 1;
for(int i=1;i<=N;++i)
if(viz[i] == false || gr[i] % 2 == 1)
ok = 0;
if(ok)
{
euler();
for(int i=1, ok = Q.size();i<ok;++i,Q.pop())
fprintf(g,"%d ",Q.front());
}
else
fprintf(g,"-1");
fclose(g);
return 0;
}
/*#include<fstream>
#include<list>
using namespace std;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
int i,n,m,x,y,grad[100001],aux[100001],sol[100001],nr,mare;
bool viz[100001];
bool ok;
list <int> v[100001];
inline void df(int k)
{ list<int>::iterator it;
viz[k] = true;
for (it=v[k].begin();it!=v[k].end();++it)
if (!viz[*it])
df(*it);
}
inline void dft(int k)
{ if (v[k].size())
{ list <int>::iterator it;
aux[++nr] = v[k].front();
it = v[2].begin();
v[k].pop_front();
it = v[aux[nr]].begin();
while (*it != k)
++it;
v[aux[nr]].erase(it);
dft(aux[nr]);
}
}
inline void adaug()
{int j;
for (i=1;i<=n && sol[i]!=aux[1];++i);
for (j=1;j<=mare-i+1;++j)
{ sol[mare+j] = sol[i+j-1];
sol[i+j-1] = aux[j];
}
mare = mare + nr - 1;
nr=0;
}
int main()
{ fin >> n >> m;
for (i=1;i<=m;++i)
{ fin >> x >> y;
v[x].push_back(y);
v[y].push_back(x);
++grad[x];
++grad[y];
}
df(1);
for (i=1;i<=n;++i)
if (!viz[i] && (grad[i] % 2))
{ fout << "-1";
return 0;
}
aux[++nr] = 1;
dft(1);
for (i=1;i<=nr;++i)
sol[i] = aux[i];
mare = nr;
nr=0;
while (!ok)
{ for (i=1;i<=n && !v[i].size();++i);
if (i>=n)
{ for (i=1;i<mare;++i)
fout << sol[i] << " ";
return 0;
}
aux[++nr] = i;
dft(i);
adaug();
}
return 0;
}
*/