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

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

图的基本操作,未完待续。。。

posted @ 2014-04-20 15:48  楠楠IT  阅读(1433)  评论(0编辑  收藏  举报