邻接矩阵实现图的基本操作
#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[n]; 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[n]; 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[n]; 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() { }
图的基本操作,未完待续。。。