Cod sursa(job #1236973)

Utilizator andreey_047Andrei Maxim andreey_047 Data 2 octombrie 2014 22:18:47
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 3.01 kb
#include <iostream>
#include <cstdio>
#define in "biperm.in","r",stdin
#define out "biperm.out","w",stdout
#include <vector>
#define nmax 10009
using namespace std;
int n,A[3][nmax],viz[nmax],nr,vi[nmax],vf[nmax],nri,nrf,nrt;
vector<int>G[nmax],d[nmax],aux[nmax],aux1[nmax],ad[nmax],ag[nmax],add[nmax],agg[nmax];
void Going(int k,int q){
 int x,y,i,j;
  x = G[k][q];
   for(i=1;i<=n;i++)
    vi[A[1][i]]=0;
                if(d[x][0]==k&&d[x].size()==2)
                        d[x][0]=d[x][1];
                        d[x].pop_back();
                    nri=0;
                    cout << k <<' '<<x<<' ';
    vi[k]=vi[x]=1;
             while(x!=k){
                if(!G[x].size()){
                    nri++;
                    y=x;
                  x=d[x][0];
                  if(G[x][0]==y&&G[x].size()==2)
                    G[x][0]=G[x][1];
                  G[x].pop_back();
                }
                else{ y=x;
                 x = G[x][0];
                    if(d[x][0]==y&&d[x].size()==2)
                      d[x][0]=d[x][1];
                     d[x].pop_back();
                 }
                 cout << x <<' ';
                 vi[x]=1;
                 viz[x]=1;
               }
            cout << nri<<'\n';
       // nr+=nri;
}
void Going2(int k,int q){
 int x,y,i,j;
  x = ag[k][q];
                if(d[x][0]==k&&ad[x].size()==2)
                        ad[x][0]=ad[x][1];
                        ad[x].pop_back();
                    nrf=0;
                   // cout << k <<' '<<x<<' ';
             while(x!=k){
                if(!ag[x].size()){
                    nrf++;
                    y=x;
                  x=ad[x][0];
                  if(ag[x][0]==y&&ag[x].size()==2)
                    ag[x][0]=ag[x][1];
                  ag[x].pop_back();
                }
                else{ y=x;
                 x = ag[x][0];
                    if(ad[x][0]==y&&ad[x].size()==2)
                      ad[x][0]=ad[x][1];
                     ad[x].pop_back();
                 }
                 //cout << x <<' ';
               }
           // cout << nri<<'\n';
        //nr+=nri;
}
int main(){
    int i,j,x,ii,p,y;
    freopen(in);
    freopen(out);
    scanf("%d",&n);
    for(i=1;i<=2;i++)
        for(j=1;j<=n;j++)
         scanf("%d",&A[i][j]);
  for(i=1;i<=n;i++){
    G[A[1][i]].push_back(A[2][i]);
    d[A[2][i]].push_back(A[1][i]);
    ag[A[1][i]].push_back(A[2][i]);
    ad[A[2][i]].push_back(A[1][i]);
  }
  p=0;
  for(i=1;i<=n;i++){
    if(!viz[A[1][i]]){
        if(G[A[1][i]].size()==1){
            Going(A[1][i],0);
//            for(j=1;j<=n;j++)
//                viz[A[1][j]]=vi[A[1][j]];
          nrt+=nri;
        }
        else if(G[A[1][i]].size()==2){
            Going(A[1][i],0);
            Going2(A[1][i],1);
            nrt=nrt+min(nri,nrf);
        }
    }
  }
//   cout << G[18][1]<<' ';
//   Going(1,0);
//   Going(5,0);
//   Going(2,0);
//   Going(3,0);
   //cout << nrt;
    return 0;
}