离散数学——欧拉回路
来源:互联网 发布:识别电影的软件 编辑:程序博客网 时间: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
- 离散数学——欧拉回路
- hdu1878—欧拉回路(欧拉回路判断)
- POJ2230 Watchcow——欧拉回路
- 欧拉回路——nyoj42
- 图论——欧拉回路
- 欧拉图——欧拉通路和欧拉回路
- HDU1878 欧拉回路【欧拉回路】
- NOJ1095奇特的图形——欧拉回路
- 杭电ACM1878——欧拉回路
- 杭电ACM3018——Ant Trip~~欧拉回路
- DFS应用——寻找欧拉回路
- 2016夏季练习——欧拉回路
- 欧拉回路——John's trip ( POJ 1041 )
- UVA10129 Play on Words —— 欧拉回路
- 欧拉回路——洛谷 P1341 无序字母对
- 前向星——附带欧拉回路求解
- [欧拉回路]51 Nod 1967——路径定向
- poj2513—并查集+欧拉回路+线段树
- KT学算法(一)——数列连续子列最大和问题的O(n)解法
- 用CSS截断字符串
- UIPickerView - 城市选择
- ubuntu下samba服务器的安装
- [转]python各模块的学习
- 离散数学——欧拉回路
- Android事件分发机制完全解析,带你从源码的角度彻底理解(上)
- libevent安装
- linux下脚本录制工具——script和scriptreplay
- Ruby Profiler详解之ruby-prof(I)
- 面试题:将一个正整数分解质因数,例如:输入90,打印出90=2*3*3*5.
- 多租户概念以及FreeLink多租户设计思想
- Ubuntu内核源码树的构建与安装
- CentOS 5.5 下安装Countly Web Server过程记录