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

 

对下图所表示的图,输出其邻接表表示 与 反向图的邻接表表示。

 

程序:

 

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class GraphReverse {
	
	public static void main(String... args) throws FileNotFoundException{
		
		GraphReverse gr = new GraphReverse();
		
		//获取边数
		int arcNum = gr.getNum("tinyDG.txt");
		
		//获取顶点数
		Scanner scan = new Scanner(new File("tinyDG.txt"));
		int vertex = scan.nextInt();
		
		//定义二维数组
		int[][] Data = new int[arcNum][2];
		int[][] reverseData = new int[arcNum][2];
		
		
		scan.nextLine();
		scan.nextLine();
		
		//初始化二维数组
		int line = 0;
		while(scan.hasNextInt()){
			Data[line][0] = scan.nextInt();
			Data[line][1] = scan.nextInt();
			reverseData[line][1] = Data[line][0];
			reverseData[line][0] = Data[line][1];
			line++;
		}
		scan.close();
		
		//输出原图的邻接表
		System.out.println("有向图的邻接表如下:");
		ALGraph(arcNum, vertex, Data);
		
		//输出反向图的邻接表
		System.out.println("反向图的邻接表如下:");
		ALGraph(arcNum, vertex, reverseData);
	}

	//生成邻接表
	private static void ALGraph(final int arcNum, final int vertex, int[][] Data) {
		List<Integer> list = new ArrayList<>();
		for(int n=0;n<vertex;n++){
			System.out.print(n+": ");
			for(int i=0;i<arcNum;i++){
				if(n==Data[i][0]){
					list.add(Data[i][1]);
				}	
			}
			int elementCount = list.size();
			int[] arraySort = new int[elementCount];
			for(int j=0;j<elementCount;j++){
				arraySort[j] = (int)list.get(j);
			}
			list.clear();
			GraphReverse gr = new GraphReverse();
			arraySort = gr.sortArray(arraySort);
			for(int j=0;j<elementCount;j++){
				System.out.print(arraySort[j]+" ");
			}	
			System.out.println();
		}
	}
	
	
	//获取边数的方法
	public int getNum(String filePath) throws FileNotFoundException{
		int arcNum=0;
		Scanner scan= new Scanner(new File("tinyDG.txt"));
		while(scan.hasNextLine()){
			scan.nextLine();
			arcNum++;
		}
		scan.close();
		return arcNum-2;
	}

	//顶点从小到大排序
	public int[] sortArray(int[] array){
		for(int i=1,n=array.length;i<n;i++)
			for(int j=0;j<n-i;j++){
				if(array[j]>array[j+1]){
					int t = array[j];
					array[j] = array[j+1];
					array[j+1] = t;
			}
		}
		return array;
	}
}

 

 

 

程序运行结果:



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值