zoukankan      html  css  js  c++  java
  • 图的存储(Java)以及遍历

       // 深搜
      private void dfs(int v) {
       visited[v] = true;
       System.out.print(v+" ");
       for (int i = 0; i <G.get(v).size(); i++) {   
            //递归调用搜索没有被访问过的当前节点的下一个节点(邻接点)   
         int k=G.get(v).get(i);
         if (!visited[k])   
              dfs(k);   
       }   
      }
      //广搜
       private void bfs(int v) {   
         //队列用来保存被访问节点的分支节点(邻接点)  
         Queue<Integer> que = new LinkedList<Integer>();   
         que.offer(v);   
         while (!que.isEmpty()) {   
          v = que.poll();   
          System.out.print(v+" ");   
          visited[v] = true;   
          //将被访问节点的分支节点(邻接点)加入到队列中   
          for (int i = 0; i <G.get(v).size(); i++) {  
           int k=G.get(v).get(i); 
           if (!visited[k]){ 
              que.add(k); 
              visited[k] = true;   
           }       
          }   
    public class ALGraph implements IGraph{
      //图的邻接表类的描述
        private GraphKind kind;
        private int vexNum,arcNum;
        private VNode[] vexs;
        
            public void createGraph() {
            // TODO Auto-generated method stub
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入图的类型");
            GraphKind kind =GraphKind.valueOf(sc.next());
            switch(kind)
            {
            case UDG:
                createUDG();
                break;
            case DG:
                createDG();
                break;
            case UDN:
                createUDN();
                break;
            case DN:
                createDN();
                break;
            }
        }
    
        private void createDN() {
            // TODO Auto-generated method stub
            //创建有向网
            Scanner sc=new Scanner(System.in);
            System.out.println("下面要创建带权的有向图(有向网)。请分别输入图的顶点数、图的边数");
            vexNum=sc.nextInt();
            arcNum=sc.nextInt();
            vexs=new VNode[vexNum];
            System.out.println("请分别输入图的各顶点");
            for(int v=0;v<vexNum;v++)
                vexs[v]=new VNode(sc.next());
            System.out.println("请输入各边的顶点及其权值:");
            for(int k=0;k<arcNum;k++)
            {
                int v=locateVex(sc.next());//弧尾
                int u=locateVex(sc.next());//弧头
                int value=sc.nextInt();
                addArc(v,u,value);
            }
            for(VNode v:vexs)
            System.out.print(v.getData()+" ");
            
        }
    
            //在图中插入边(或弧)节点,图右顶点集合边集组成,因此创建图必须先建立图的顶点集合边集
        private void addArc(int v, int u, int value) {
            // TODO Auto-generated method stub
            ArcNode arc = new ArcNode(u,value);
            arc.setNextArc(vexs[v].getFirstArc());
            vexs[v].setFirstArc(arc);
            
        }
    //图的邻接表表示中的顶点节点类
    public class VNode {
    
        private Object data;// 顶点信息
        private ArcNode firstArc; //指向第一条依附于该顶点的弧
    }
    
    //图的邻接表表示中 边结点 类
    public class ArcNode {
        private int adjVex;//该弧所指向的顶点位置
        private int value;//边或弧的权值
        private ArcNode nextArc;//指向下一条弧
    }
  • 相关阅读:
    websocket使用nginx作为反向代理
    curl模拟http发送get或post接口测试
    linux tail -f messages查看控制台失败
    shell中使用>/dev/null 2>&1 丢弃信息
    mysql备份与还原
    计算机中RAM和ROM
    *C语言有关指针的变量声明中的几个易错点
    五种存储变量补充~作用域和存储时期
    typedef和#define的简单比较
    fopen()函数参数
  • 原文地址:https://www.cnblogs.com/happinessqi/p/3560764.html
Copyright © 2011-2022 走看看