M¹nh D¬ng Biªn So¹n
Bé M«n CÊu Tróc D÷ LiÖu
Gi¶i ThuËt 2012
§ª Sè 15
Trong Bé §Ò ¤n TËp
#include<iostream.h>
#include<fstream.h>
#include<math.h>
#include<conio.h>
#include<time.h>
#include<string.h>
#include<stdio.h>
ifstream datain("C:/cau truc du lieu/dethi/dothi15.in.txt");
/*
Chu Trinh Euler Vo Huong
*/
char S[100][200];
int a[100][100],n,x[100];
void NhapDL(int &n)
{
datain>>n;
for(int i=0;i<=n;i++)
datain.getline(S[i],200,'\n');
}
int ket(char S)
{
int k=int (S)-int ('0');
return k;
}
int chuyen(char S[])
{int j=0,k=0;
for(int i=strlen(S)-1;i>=0;i )
{k+=ket(S[i])*pow(10,j);j++;}
return k;
}
void ChuyenKe()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
a[i][j]=0;
for(int i=1;i<=n;i++)
{
int j=0;
while(S[i][j]!='\0')
{
if(S[i][j]>='0'&&S[i][j]<='9')
{
char SS[200];
int k=0;
while(S[i][j]>='0'&&S[i][j]<='9')
{
SS[k]=S[i][j];
k++;
j++;
}
SS[k]='\0';j++;
a[i][chuyen(SS)]=1;
a[chuyen(SS)][i]=1;
}
}
}
}
void DFS(int i)
{
x[i]=1;
for(int j=1;j<=n;j++)
if(x[j]==0&&a[i][j]==1)DFS(j);
}
int LienThong()
{
DFS(1);
for(int i=1;i<=n;i++)
if(x[i]==0)return 0;
return 1;
}
int Bac()
{
int deg,i,j;
for(i=1;i<=n;i++)
{
deg=0;
for(int j=1;j<=n;j++)
deg+=a[i][j];
if(deg%2)return 0;
}
return 1;
}
void CTEuler(int ce[])
{
int st[100*100],i,j,h,k,t;
t=1;
st[t]=1;
k=0;
while(t>0)
{
h=st[t];
j=0;
for(i=1;i<=n;i++)
if(a[h][i]==1)
{
t++;
st[t]=i;
j=i;
a[h][i]=0;
a[i][h]=0;
break;
}
if(j==0)
{
k++;
ce[k]=h;
t ;
}
}
for(i=k;i>1;i )
cout<<ce[i]<<" - ";
cout<<ce[1]<<endl;
}
main()
{
int ce[100];
NhapDL(n);
ChuyenKe();
if(LienThong()==0||Bac()==0)
cout<<"G khong la do thi Euler"<<endl;
else CTEuler(ce);
}