zoukankan      html  css  js  c++  java
  • 邻接矩阵实现图的基本操作

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

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

  • 相关阅读:
    jquery源码 DOM加载
    用 Vue 全家桶二次开发 V2EX 社区
    java中初始化对象变量的方法
    跟我一起学extjs5(08--自己定义菜单1)
    NYOJ 57 6174问题
    Android 手动按power键上锁,没有锁屏提示音,无法恢复【单机必现】
    说好的加班呢
    排序总结之高速排序
    【c语言】模拟实现库函数的atof函数
    Oracle存储过程update受外键约束的主键值时完整性冲突解决方式
  • 原文地址:https://www.cnblogs.com/nannanITeye/p/3676594.html
Copyright © 2011-2022 走看看