邻接矩阵实现图的基本操作
2014-04-20 15:48
543 查看
#include <stdio.h> #include <stdlib.h> #include<math.h> #define L 100 int main() { void initGraph(int g[][L],int n,int m); void pointInfo(int g[][L],int g1[][8],int d1[],int n); void findHMD(int g[][L],int g1[][8],int d1[],int n); void findHMD2(int g[][L],int g1[][8],int d1[],int n); void dfsDepths(int g1[][8],int d1[],int n); void bfsNoRecursion(int g1[][8],int d1[],int n); void dfsByRecursion(int g1[][8],int d1[],int n); void dfs(int v[],int m,int g1[][8],int d1[]); int g[L][L],g1[L][8],d1[L]; int n=4,m=4; int N=n*m; initGraph(g,n,m); pointInfo(g,g1,d1,N); dfsByRecursion(g1,d1,N); printf("\n"); bfsNoRecursion(g1,d1,N); return 0; } void initGraph(int g[][L],int n,int m) { if(n<=0 || m<=0) return; int N=n*m; int ri,ci,rj,cj,rd,cd; int i=0,j=0; for(i=0;i<N;i++) { for(j=0;j<N;j++) { g[i][j]=0; } } for(i=0;i<N;i++) { ri=(i/m)+1,ci=i%m; for(j=0;j<N;j++) { rj=(j/m)+1,cj=j%m; rd=abs(rj-ri); cd=abs(cj-ci); if((rd==1 && cd==2) || (rd==2 && cd==1)) { g[i][j]=1; } } } } void pointInfo(int g[][L],int g1[][8],int d1[],int n) { int i,j,k; for(i=0;i<n;i++) { k=0; for(j=0;j<n;j++) { if(g[i][j]) { g1[i][k]=j; k++; } } d1[i]=k; } } void findHMD(int g[][L],int g1[][8],int d1[],int n) { int v[1000],w[1000],u[1000],y; int i,j,la; for(i=0;i<n;i++) v[i]=0; v[0]=1,w[0]=0; la=1; u[0]=0; j=-1; while(1) { int x=u[la-1]; int flag=0; for(j=j+1;j<d1[x];++j) { y=g1[x][j]; if(v[y])continue; else { if(la==n-1 && !g[y][0])continue; else { if(la<n-1){ u[la]=y;w[la]=j;v[y]=1;flag=1;break; } else { printf("1\n"); for(i=0;i<n;i++) printf("%3d",u[i]); return; } } } } if(flag==1){la++;j=-1;continue;} la--; if(la>=2){ j=w[la];y=u[la];v[y]=0; } else {printf("0\n");return;} } } void findHMD2(int g[][L],int g1[][8],int d1[],int n) { int v[1000],w[1000],u[1000],y; int i,j,la,z; for(i=0;i<n;i++) v[i]=0; v[0]=1,w[0]=0; la=1; u[0]=0; j=-1; while(1) { int x=u[la-1]; int flag=0; for(j=j+1;j<d1[x];++j) { y=g1[x][j]; if(v[y])continue; else { if(la==n-1 && !g[y][0])continue; else { if(la<n-1){ if(d1[y]<2) continue; for(i=0;i<d1[x];i++) { if(i==j) continue; z=g[x][i]; if(v[z]==2){y=z,j=i;} } u[la]=y;w[la]=j;v[y]=1;flag=1;break; } else { printf("1\n"); for(i=0;i<n;i++) printf("%3d",u[i]); return; } } } } if(flag==1){la++;j=-1;continue;} la--; if(la>=2){ j=w[la];y=u[la];v[y]=0; } else {printf("0\n");return;} } } //深度优先搜索 void dfsDepths(int g1[][8],int d1[],int n) { int i=0,j=0,k=0; int v ; for(i=0;i<n;i++) v[i]=0; for(i=0;i<n;i++) { if(!v[i]) { v[i]=1; printf("%3d",i); k=i; for(j=0;j<d1[k];j++) { if(!v[g1[k][j]]) { v[g1[k][j]]=1; printf("%3d\n",g1[k][j]); k=g1[k][j]; j=-1; continue; } } } } } void dfsByRecursion(int g1[][8],int d1[],int n) { void dfs(int v[],int m,int g1[][8],int d1[]); int i=0; int v ; for(i=0;i<n;i++) v[i]=0; for(i=0;i<n;i++) { if(!v[i]) { dfs(v,i,g1,d1); } } } void dfs(int v[],int m,int g1[][8],int d1[]) { int i=0; v[m]=1; printf("%3d",m); for(i=0;i<d1[m];i++) { if(!v[g1[m][i]]) dfs(v,g1[m][i],g1,d1); } } void bfsNoRecursion(int g1[][8],int d1[],int n) { int v ; int i,m,j; for(i=0;i<n;i++) v[i]=0; for(i=0;i<n;i++) { if(!v[i]) { v[i]=1; printf("%3d",i); } else continue; for(j=0;j<d1[i];j++) { m=g1[i][j]; if(!v[m]) { v[m]=1; printf("%3d",m); } } } } void bfsByRecursion() { } void bfs() { }
图的基本操作,未完待续。。。
相关文章推荐
- 数据结构编程笔记十八:第七章 图 图的邻接矩阵存储表示及各基本操作的实现
- c语言实现图的基本操作--邻接矩阵存储
- 以邻接矩阵作为存储结构实现图的创建与基本操作
- 仅使用基本的表操作实现两个排序后的表L1和L2的并集
- 用PHP实现MONGODB的基本操作
- 二叉树(二叉链式存储)8种基本操作的实现
- jQuery中实现动画效果的基本操作介绍
- 单链表基本操作c语实现
- Asp操作Excel的一些基本实现
- C语言实现顺序表的基本操作
- 二叉树基本操作的程序实现
- 用php实现mongoDB的基本操作(转)
- 南邮数据结构实验二---二叉树的基本操作及哈夫曼编码译码系统的实现
- java实现二叉树基本操作
- 不带头节点的单链表及其基本操作(Java实现)
- JAVA的solr操作实现(基本操作)
- Avl树的基本操作(c语言实现)
- 轻松学习jQuery插件EasyUI EasyUI实现拖动基本操作
- 串基本操作的实现(数据结构实验)
- 数据结构-堆基本概念以及操作实现