您的位置:首页 > 其它

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

2014-04-10 09:11 483 查看
代码:

/** 

 * 有向图邻接表表示及反向图构造 

 */  

public class GraphReverse {  

    //vertex,顶点数目  

    private int v;  

    //edge,边数目  

    private int e;  

    //有向图的邻接表Map集合,key为某顶点,value为该顶点的邻接顶点集合  

    private Map<Integer,List<Integer>> adjacencyList;  

    //反向图的邻接表Map集合  

    private Map<Integer,List<Integer>> adjacencyListReverse;  

      

    //初始化  

    public GraphReverse(int vertex, int edge){  

        if(edge<0) throw new RuntimeException("Number of edges must be nonnegative");  

        if (edge > vertex*vertex) throw new RuntimeException("Too many edges");  

          

        v = vertex;       

        e = edge;  

          

        adjacencyList = new HashMap<Integer,List<Integer>>();  

        for(int i=0; i<v; i++){  

            adjacencyList.put(i, new ArrayList<Integer>());  

        }  

          

        adjacencyListReverse = new HashMap<Integer,List<Integer>>();  

        for(int i=0; i<v; i++){  

            adjacencyListReverse.put(i, new ArrayList<Integer>());  

        }  

    }  

      

    //获取有向图的邻接表  

    public Map<Integer,List<Integer>> getAdjacencyList(){  

        return adjacencyList;  

    }  

    //获取反向图的邻接表  

    public Map<Integer,List<Integer>> getAdjacencyListReverse(){  

        return adjacencyListReverse;  

    }  

      

    //添加有向图的边  

    public void addEdge(int vertex1, int vertex2){  

        List<Integer> vList = adjacencyList.get(vertex1);  

        vList.add(vertex2);       

    }  

    //添加反向图的边  

    public void addEdgeReverse(int vertex1, int vertex2){  

        List<Integer> vList = adjacencyListReverse.get(vertex1);  

        vList.add(vertex2);       

    }  

}  

测试代码:

[java] view
plaincopy





public static void main(String[] args) {  

    try(Scanner scanner = new Scanner  

            (GraphDAG.class.getClassLoader().getResourceAsStream("tinyDG.txt"));){  

              

        //第一行的数字是顶点的数目  

        int v = scanner.nextInt();  

        //第二行的数字是边的数目  

        int e = scanner.nextInt();  

          

        //System.err.println(String.format("该有向图的定点数: %d , 边数: %d\n", v, e));  

        GraphReverse graphReverse = new GraphReverse(v, e);               

          

        //读取每条边对应的两个顶点,将边添加到图的邻接表里  

        for (int i = 0; i < e; i++) {                  

            int v1 = scanner.nextInt();  

            int v2 = scanner.nextInt();  

            graphReverse.addEdge(v1, v2);  

            graphReverse.addEdgeReverse(v2, v1);  

        }  

          

        System.err.println("邻接表表示:");  

        printAdjacencyList(graphReverse.getAdjacencyList());  

          

        System.err.println("\n反向图的邻接表表示:");  

        printAdjacencyList(graphReverse.getAdjacencyListReverse());  

              

    }  

}  

  

/** 

 * 打印邻接表 

 * @param adjacencyList 

 */  

public static void  printAdjacencyList(Map<Integer,List<Integer>> adjacencyList){  

    for(Map.Entry<Integer,List<Integer>> entry : adjacencyList.entrySet()){  

        //某顶点  

        int vertex = entry.getKey();  

        System.err.print(vertex+":\t");  

          

        //该顶点的所有邻接顶点  

        List<Integer> vList = entry.getValue();  

        if(vList.size()>0){  

            for(int v : vList){  

                System.err.print(v+"\t");  

            }  

        }  

        System.err.println();  

    }  

}  

运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: