上机课老师用c语言写了欧拉回路的寻找,由于一开始答案错误,而且老师一时半会儿也没有找出错误,搁置了一段时间。后来老师自己调试出错误地方并改正,但我没能真正理解,暂时记录下,等到有时间了再好好看看看。
以下是代码:
#include <stdio.h>
#define N 110
int IsConnection(int a[][N],int n);//判断连通性
void Fluery(int a[][N],int n);//欧拉回路寻找
int NexVertex(int a[][N],int p,int n);//寻找下一个点
int IsBridge(int a[][N],int p,int q,int n);//判断是否是桥
void MatrixMul(int a[][N],int b[][N],int c[][N],int n);
void MatrixCopy(int a[][N],int b[][N],int n);
void MatrixIdentity(int a[][N],int n);
void MatrixAdd(int a[][N],int b[][N],int c[][N],int n);
void MatrixConnectivity(int a[][N],int b[][N],int n);
int main()
{
int n,m;
int i,j,k;
int x,y;
while(scanf("%d%d",&n,&m) != EOF)
{
int a[N][N]={0};
int c[N][N]={0};
int b[N]={0};
int num=0;
for(i=0;i<m;i++)
{
scanf("%d%d",&x,&y);
a[x-1][y-1]=1;
a[y-1][x-1]=1;
b[x-1]++;
b[y-1]++;
}
MatrixConnectivity(a,c,n);
if(!IsConnection(c,n))
{
printf("NULL\n");
continue;
}
for(i=0;i<n;i++)
if(b[i] % 2 != 0)
num++;
if(num != 2)
{
printf("NULL\n");
continue;
}
Fluery(a,n);
}
return 0;
}
void Fluery(int a[][N],int n)
{
int p=0;
int q;
printf("%d",p+1);
while((q = NexVertex(a,p,n)) >= 0)
{
a[p][q] = a[q][p] = 0;
p=q;
printf("->%d",p+1);
}
printf("\n");
}
int NexVertex(int a[][N],int p,int n)
{
int q;
int i;
int d=0;
for(i=0;i<n;i++)
{
if(a[p][i])
{
d++;
q=i;
}
}
if(d==0)
return -1;
else if(d == 1)
return q;
else
{
for(i=0;i<n;i++)
{
q=i;
if(a[p][q] && !IsBridge(a,p,q,n))
return q;
}
}
}
int IsBridge(int a[][N],int p,int q,int n)
{
int i;
int ta[N][N],b[N][N],c[N][N];
MatrixCopy(ta,a,n);
ta[p][q]=ta[q][p]=0;
MatrixCopy(b,ta,n);
for(i=2;i<=n;i++)
{
MatrixMul(c,ta,b,n);
MatrixCopy(b,c,n);
if(b[p][q] > 0)
return 0;
}
return 1;
}
int IsConnection(int a[][N],int n)
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(a[i][j] == 0)
{
return 0;
}
}
}
return 1;
}
void MatrixMul(int a[][N],int b[][N],int c[][N],int n)
{
int i,j,k;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
a[i][j]=0;
for(k=0;k<n;k++)
{
a[i][j]=a[i][j]+b[i][k] * c[k][j];
}
}
}
}
void MatrixCopy(int a[][N],int b[][N],int n)
{
int i,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
a[i][j]=b[i][j];
}
void MatrixIdentity(int a[][N],int n)
{
int i,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if(i == j)
a[i][j]=1;
else
a[i][j]=0;
}
}
void MatrixAdd(int a[][N],int b[][N],int c[][N],int n)
{
int i,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
a[i][j]=b[i][j] +c[i][j];
}
void MatrixConnectivity(int a[][N],int b[][N],int n)
{
int i;
int at[N][N],c[N][N],bt[N][N];
MatrixCopy(c,a,n);
MatrixIdentity(bt,n);
MatrixAdd(b,c,bt,n);
for(i= 2;i<n;i++)
{
MatrixMul(at,a,c,n);
MatrixCopy(c,at,n);
MatrixAdd(bt,b,c,n);
MatrixCopy(b,bt,n);
}
}
由于一开始我写的判断连通性和老师写的不一样,所以导致之后的代码都不能很好地理解,等以后再深入理解。