第五周作业——有向图邻接表表示及反向图构造

来源:互联网 发布:手游挂机软件 编辑:程序博客网 时间:2024/05/17 08:14

1. 有向图中反向图构造。对tinyDG.txt(http://pan.baidu.com/s/1o6jWtcA)文件所表示的图,输出其邻接表表示 与 反向图的邻接表表示。类名GraphReverse

源码:

import java.io.BufferedReader;import java.io.File;import java.io.FileReader;import java.util.ArrayList;import java.util.LinkedList;import java.util.List;import java.util.Queue;import java.util.Scanner;public class GraphReverse {   private int vertexNum;   private int arcNum;   private boolean visited[];   private List<ArrayList<Integer>> graphListS;   private List<ArrayList<Integer>> graphListF;   public GraphReverse(int vertexNum,int arcNum,List<ArrayList<Integer>> graphListS,List<ArrayList<Integer>> graphListF){   this.vertexNum=vertexNum;   this.graphListS=graphListS;   visited=new boolean[vertexNum];   this.graphListF=graphListF;   }   public static void main(String[] args) {String path="src/tinyDG.txt";try{Scanner scanner=new Scanner(new File(path));List<ArrayList<Integer>> graphListS=new ArrayList<ArrayList<Integer>>();//存储有向图的邻接表List<ArrayList<Integer>> graphListF=new ArrayList<ArrayList<Integer>>();//存储有向图的反向图的邻接表    int vertexNum=scanner.nextInt();    int arcNum=scanner.nextInt();     for(int i=0;i<vertexNum;i++){     graphListS.add(new ArrayList<Integer>());     graphListF.add(new ArrayList<Integer>());     }         //有向图的存储    for(int i=0;i<arcNum;i++){    int u=scanner.nextInt();    int v=scanner.nextInt();    if(!graphListS.get(u).contains(v)){    graphListS.get(u).add(v);    }     //有向图的反向图存储    if(!graphListF.get(v).contains(u)){    graphListF.get(v).add(u);    }     }        //有向图的广度优先遍历    GraphReverse g1=new GraphReverse(vertexNum, arcNum, graphListS,null);    System.out.println("有向图的邻接表的结果是:");    g1.bfs(vertexNum/2+1,graphListS);    //有向图的反向图广度优先的遍历    GraphReverse g2=new GraphReverse(vertexNum, arcNum, null,graphListF);    System.out.println("有向图的反向图的邻接表结果是:");     g2.bfs(1,graphListF);}catch (Exception e) { e.printStackTrace();}  }   private  void bfs(int v,List<ArrayList<Integer>> graphList){     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 <graphList.get(v).size(); i++) {         int k=graphList.get(v).get(i);        System.out.print(k+" ");       if (!visited[k]){           //que.add(k);           que.offer(k);          visited[k] = true;          }        }       System.out.println();   }      }}
运行结果:



0 0
原创粉丝点击