您的位置:首页 > 其它

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

2014-04-11 13:02 288 查看
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();  

       }     

   }  

}  

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