您的位置:首页 > 其它

邻接矩阵实现图的基本操作

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()
{

}


图的基本操作,未完待续。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: