M¹nh D¬ng Biªn So¹n
Bé M«n CÊu Tróc D÷ LiÖu
Gi¶i ThuËt 2012
§ª Sè 30 C¸ch 2
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/data30.in.txt");
ofstream dataout("C:/cau truc du lieu/dethi/ketqua30e.out.txt");
/*
Tao Nut Giao Thong Ung Y Va Hanh Phuc Nhat
*/
int a[100][100],n,dem=0,aa[100],bb[100],x[100],dem1;
void NhapDL(int &n)
{
datain>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
datain>>a[i][j];
for(int i=1;i<=n;i++)
{
int k=0;
for(int j=1;j<=n;j++)
if(a[i][j]==1)
{
if(j>i)
{dem++;
aa[dem]=i;
bb[dem]=j;}
}
}
}
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()
{
for(int i=1;i<=n;i++)
x[i]=0;
DFS(1);
for(int i=1;i<=n;i++)
if(x[i]==0)return 0;
return 1;
}
void DFS(int i,int j,int ax[][100])
{
x[i]=1;
for(int k=1;k<=n;k++)
if(ax[i][k]==1&&x[k]==0){
if(k==j)
{
dem1=1;
return ;
}
DFS(j,k,a);
}
}
int KT(int ax[][100],int n)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i!=j){
dem1=0;
for(int k=1;k<=n;k++)
x[k]=0;
DFS(i,j,ax);
if(dem1==0)return 0;
}
return 1;
}
int ThucHien(int ax[][100])
{
for(int i=0;i<=pow(2,dem)-1;i++)
{int xx[100];
int min=0;
int j=i;
while(i>0)
{
min++;
xx[min]=i%2;
i=i/2;
}
i=j;
for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++)
ax[j][k]=0;
for(int k=1;k<=dem;k++)
if(xx[k]==0)
ax[aa[k]][bb[k]]=1;
else ax[bb[k]][aa[k]]=1;
if(KT(ax,n)==1)return 1;
}
return 0;
}
main()
{
NhapDL(n);
cout<<dem<<endl;
if(LienThong()==0)dataout<<"Vo Nghiem"<<endl;
else
{
int ax[100][100];
if(ThucHien(ax)==1)
{
dataout<<dem<<endl;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(ax[i][j]==1){dataout<<i<<"
"<<j<<endl;cout<<i<<" "<<j<<endl;}
}
else dataout<<"Vo Nghiem"<<endl;
}
}