• Graph And Trave


    图采用邻接表法,Java中

    DFS:先深后广,采用堆栈和递归两种数据结构,

    BFS:先广后深:采用队列的数据结构: Java的代码:

    package Graph;
    
    //对零接链表的模拟,下一个节点只能表示兄弟节点
    class Node{
        int Data;
        Node next;
        public Node(int Data)
        {
            this.Data=Data;
            this.next=null;
            
        }
        
        
    }
    public class GraphLink {
        //表头和链接节点
        public Node first;
        public Node last;
        public static int run[]=new int[9];
        
        //数据结构进行BFS,使用队列
        public final static int MAXSIZE=10;
        static int[] queue=new int[MAXSIZE];
        static int front=-1;
        static int rear=-1;//指向最后一个位置
        
        public static void enqueue(int value)
        {
            if(rear<MAXSIZE)
            {
                rear++;
                queue[rear]=value;
            }else
            {
                return;
            }
            
        }
        public static int dequeue()
        {
            if(front==rear) return -1;
            front++;//front 从-1开始
            return queue[front];
        }
        public boolean isEmpty()
       {
             return first==null;
       }
        public void print()
        {
             Node current=first;
             while(current!=null)
            {
                System.out.println("["+current.Data+"]");
                current=current.next;
              }
        }
         
        public void insert(int X)
        {
            Node newNode=new Node(X);
            if(this.isEmpty())
            {
                
                first=newNode;
                last=newNode;
            }
            else
            {
                last.next=newNode;
                last=newNode;
                
            }
        }
        public static void BFS(int current,GraphLink graph[])
        {
            Node tmpNode;
            enqueue(current);
            System.out.println("["+current+"]");
            //类似于层次遍历一样
            while(front!=rear)//当相等于表示队列是空的
            {
                current=dequeue();
                tmpNode=graph[current].first;
                run[current]=1;
                while(tmpNode!=null)
                {    
                    if(run[tmpNode.Data]==0)
                    {
                    enqueue(tmpNode.Data);
                    run[tmpNode.Data]=1;
                    System.out.println("["+tmpNode.Data+"]");
                    }
                    tmpNode=tmpNode.next;
                }
            }
        }
    public static void  DFS(int current,GraphLink graph[])
    {//先深后广,堆栈实现的可以用递归
        run[current]=1;
        System.out.println("["+current+"]");
        Node T=graph[current].first;
        while(T!=null)
        {
            if(run[T.Data]==0)
            {
                DFS(T.Data,graph);
            }
                T=T.next;
            
            
        }
    }
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            int DataNum;
            int Data[][]={{1,2},{2,1},{1,3},{3,1},{2,4},{4,2},{2,5},{5,2},{3,6},{6,3},{3,7}
            ,{7,3},{4,5},{5,4},{6,7},{7,6},{5,8},{8,5},{6,8},{8,6}};
            GraphLink Graph[]=new GraphLink[9];//申请的是一个数组图链表数组
            int i,j;
            for(i=1;i<9;i++)
            {    run[i]=0;
                //表头节点,只有5个顶点
                Graph[i]=new GraphLink();
                System.out.println("图形顶点"+i+"内容:");
                for(j=0;j<20;j++)
                {
                    if(Data[j][0]==i)
                    {
                        
                        Graph[i].insert(Data[j][1]);
                    }
                    
                    
                }
                Graph[i].print();
            }
            
            System.out.println("DFS");
                DFS(1,Graph);
            for(i=0;i<9;i++)
            {
                run[i]=0;
            }
        System.out.println("BFS");
            BFS(1,Graph);
        }
    }
     1 图形顶点1内容:
     2 [2]
     3 [3]
     4 图形顶点2内容:
     5 [1]
     6 [4]
     7 [5]
     8 图形顶点3内容:
     9 [1]
    10 [6]
    11 [7]
    12 图形顶点4内容:
    13 [2]
    14 [5]
    15 图形顶点5内容:
    16 [2]
    17 [4]
    18 [8]
    19 图形顶点6内容:
    20 [3]
    21 [7]
    22 [8]
    23 图形顶点7内容:
    24 [3]
    25 [6]
    26 图形顶点8内容:
    27 [5]
    28 [6]
    29 DFS
    30 [1]
    31 [2]
    32 [4]
    33 [5]
    34 [8]
    35 [6]
    36 [3]
    37 [7]
    38 BFS
    39 [1]
    40 [2]
    41 [3]
    42 [4]
    43 [5]
    44 [6]
    45 [7]
    46 [8]

     使用C++语言:

    #include<iostream>
    #include<queue>
    using namespace std;
    #define MAXSIZE 20
    //采用邻接表方式建立图,为了节省空间
    //最终要的东西有领接链表
    //typedef struct AdjNode PtrToAdjVNode;
    typedef struct AdjNode{
        //相邻顶点位置信息
        int weight;
        int AdjV;//相邻顶点信息;
        AdjNode*next;
    
    }PtrToAdjVNode;
    
    //如果在这里*PtrToAdjNode *ptr=new Ptr这里表示指针的指针,不行的
    typedef struct Vnode{
        //表头信息
        PtrToAdjVNode *FirstEdge;
        //每个表头函数子节点数
        int DataNum;
    
    }AdjList[MAXSIZE];
    int *Flag=new int[20];
    typedef struct GNode{
        int Vem;
        int Edge;    //如果是邻接矩阵MG
        AdjList  LG;//一个邻接表的表头,存取每个顶点,下一位存取与之相邻的顶点
    }LGraph;
    void InsertEdge(LGraph *G,int Current,int NextVer)
    {
        PtrToAdjVNode *newNode=new PtrToAdjVNode;
        PtrToAdjVNode *tmp;
        (newNode)->AdjV=NextVer;(newNode)->weight=NULL;(newNode)->next=NULL;
        
        
        if((G)->LG[Current].FirstEdge==NULL)
        { 
                (G->LG[Current].FirstEdge)=newNode;
          }
        else
        {
             tmp=G->LG[Current].FirstEdge;
            while(tmp->next!=NULL)
            {
                tmp=tmp->next;
                    
            }
            tmp->next=newNode;
            
        }
    
    
    }
    LGraph CreateGraph(LGraph *G)
    {
        int VerterNum;
        cin>>VerterNum;
        (G)->Vem=VerterNum;
        (G)->Edge=0;
    
        //清空表头中内容
        int V;
        for(V=1;V<=VerterNum;V++)
            G->LG[V].FirstEdge=NULL;
        //通过插值建立邻接表
        int NextVer=1,CurrentVer;//负数表示1输入表示截止
        for(V=1;V<=VerterNum;V++)
        {
            cin>>CurrentVer;
            while(true)
            {
                cin>>NextVer;
                if(NextVer<0)
                    break;
                InsertEdge(G,CurrentVer,NextVer);
            }
        }
        return *G;
    
    }
    void DFS(int X,LGraph *G)
    {
        
        cout<<"["<<X<<"]"<<endl;
        Flag[X]=1;
    PtrToAdjVNode *tmp=G->LG[X].FirstEdge;
    while( tmp!=NULL)
    {
            
        if(Flag[tmp->AdjV]==0)//此顶点位置没有被遍历
            DFS(tmp->AdjV,G);
        tmp=tmp->next;
    }
    
    }
    void BFS(int X,LGraph *G)
    {
        queue<int >Q;
        Q.push(X);PtrToAdjVNode *tmp;
        Flag[X]=1;
        while(!Q.empty())
        {
            cout<<Q.front()<<" ";
            tmp=G->LG[Q.front()].FirstEdge;
            while(tmp!=NULL)
            {
                    if(Flag[tmp->AdjV]==0)
                {    
                          Q.push(tmp->AdjV);
                         Flag[tmp->AdjV]=1;
                          
                }
                 tmp=tmp->next;    
            }
            Q.pop();
        }
    
    
    }
    int main()
    {
        LGraph *Graph=new LGraph;
    
        CreateGraph(Graph);
        memset(Flag,0,sizeof(int)*20);
        DFS(1,Graph);
        memset(Flag,0,sizeof(int)*20);
        BFS(1,Graph);
        return 0;
    }

  • 相关阅读:
    es6 语法 (数值扩展)
    手机日期插件 (转加上自己喜欢的)
    仿微信抢红包(js 转)
    默认时间为今天
    es6 语法 (解构赋值)
    es6 语法 (let 和const)
    es6环境搭建
    express 安装和运行
    git 常用操作,下拉,提交,更新,还原
    排序。
  • 原文地址:https://www.cnblogs.com/woainifanfan/p/6043743.html
Copyright © 2020-2023  润新知