离散数学——欧拉回路

来源:互联网 发布:识别电影的软件 编辑:程序博客网 时间:2024/06/05 05:01

上机课老师用c语言写了欧拉回路的寻找,由于一开始答案错误,而且老师一时半会儿也没有找出错误,搁置了一段时间。后来老师自己调试出错误地方并改正,但我没能真正理解,暂时记录下,等到有时间了再好好看看看。

以下是代码:

#include <stdio.h>#define N 110int 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);    }}

由于一开始我写的判断连通性和老师写的不一样,所以导致之后的代码都不能很好地理解,等以后再深入理解。

0 0