Cod sursa(job #1735263)

Utilizator danutbodbodnariuc danut danutbod Data 29 iulie 2016 13:23:59
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 3.71 kb
//var I 100p (citirea cu scan) iterativ cu stiva  expl.
#include<cstdio>
#include<vector>
#include<deque>
using namespace std;
int n,m,x,y,i,j,nod,muchieij;
int gr[100003];
bool viz[500003];
vector<int>a[100003];
vector<int>muc[100001];
deque<int>st;
int main()
{   freopen("ciclueuler.in","r",stdin);
    freopen("ciclueuler.out","w",stdout);
    scanf("%d %d",&n,&m);
    for(i=1;i<=m;i++)
    {
        scanf("%d %d",&x,&y);
        a[x].push_back(y);
        a[y].push_back(x);
        muc[x].push_back(i);
        muc[y].push_back(i);
        gr[x]++;
        gr[y]++;
    }
    for(i=1;i<=n;i++)
      if(gr[i]%2==1)
      {printf("-1"); return 0; }
    st.push_back(1);
    while(!st.empty())
    {
        i=st.back();
        if(gr[i]==0)
           {    printf("%d ",i); st.pop_back(); }
        else
        {
            j=a[i].back();
            muchieij=muc[i].back();
            a[i].pop_back();
            muc[i].pop_back();
            if(viz[muchieij]==0)
            {
                viz[muchieij]=1;
                st.push_back(j);
                gr[i]--;
                gr[j]--;
            }
        }
    }
    return 0;
}
////var I 80p (citirea!) iterativ cu stiva  expl.
//#include<fstream>
//#include<vector>
//#include<deque>
//using namespace std;
//ifstream fi("ciclueuler.in");
//ofstream fo("ciclueuler.out");
//int n,m,x,y,i,j,nod,muchieij;
//int gr[100003];
//bool viz[500003];
//vector<int>a[100003];
//vector<int>muc[100001];
//deque<int>st;
//int main()
//{
//    fi>>n>>m;
//    for(i=1;i<=m;i++)
//    {
//        fi>>x>>y;
//        a[x].push_back(y);
//        a[y].push_back(x);
//        muc[x].push_back(i);
//        muc[y].push_back(i);
//        gr[x]++;
//        gr[y]++;
//    }
//    for(i=1;i<=n;i++)
//      if(gr[i]%2==1)
//      {   fo<<"-1"; return 0; }
//    st.push_back(1);
//    while(!st.empty())
//    {
//        i=st.back();
//        if(gr[i]==0)
//           {   fo<<i<<" "; st.pop_back(); }
//        else
//        {
//            j=a[i].back();
//            muchieij=muc[i].back();
//            a[i].pop_back();
//            muc[i].pop_back();
//            if(viz[muchieij]==0)
//            {
//                viz[muchieij]=1;
//                st.push_back(j);
//                gr[i]--;
//                gr[j]--;
//            }
//        }
//    }
//    return 0;
//}
//var II
////100p (dar fara inline face 70p cred ca creapa stiva?)
//#include <fstream>
//#include <bitset>
//#include <vector>
//#define MAX 100003
//using namespace std;
//ifstream fi("ciclueuler.in");
//ofstream fo("ciclueuler.out");
//
//int n,m,x,y;
//bitset < 5*MAX > viz;      //pentru stergerea muchiilor vizitate
//struct muchie {int x,y;} E[5*MAX];//memorarea muchiilor
//vector < int > G[MAX],ciclu;
//
//int VerifEulerian(){
//     for(int i=1;i<=n;i++)
//          if(G[i].size()%2==1)return 0;
//     return 1;
//}
//inline void DF(int nod){     //fara inline la 3 teste crapa stiva?
//     for(int i=0;i<G[nod].size();i++)
//          if(!viz[G[nod][i]])
//            {
//                viz[G[nod][i]]=1;
//                DF(E[G[nod][i]].x+E[G[nod][i]].y-nod);//(x+y)-x==y
//            }
//     ciclu.push_back(nod);
//}
//
//int main()
//{
//     fi>>n>>m;
//     for(int i=1;i<=m;i++)
//     {
//          fi>>x>>y;
//          G[x].push_back(i); G[y].push_back(i);//memorez indicele muchiei
//          E[i].x=x,E[i].y=y;               //memorez muchia cu indicele i
//     }
//     if(VerifEulerian())
//     {
//          DF(1);
//          for(int i=0;i<ciclu.size();i++)fo<<ciclu[i]<<' ';
//          fo<<'\n';
//     }
//     else fo<<-1<<'\n';
//     return 0;
//}