图中的边关系和节点关系之间的转换
边关系转为图
在relation数组中记录的是从一个节点到一个节点,前面的就叫做from,后面的就叫做to,因此每次添加进节点关系的数组的时候,from就是数组索引,to就是需要加入的值。也就是graph.get(from).add(to)。因为需要对graph不停进行增加,所以数组采用List<List>。
最后代码如下:
public static int[][] relation2graph(int[][] relation){
List<List<Integer>> graph = new ArrayList<>();
System.out.println(relation.length);
for (int i = 0; i < relation.length; i++) {
//节点
int from = relation[i][0];
//下一个节点
int to = relation[i][1];
//当该节点还没有一个下一个节点集合 为它新建一个
while(from >= graph.size()){
graph.add(new ArrayList<>());
}
//如果该节点已经有集合了 就将它的下一个节点加入
graph.get(from).add(to);
}
System.out.println(graph);
//将 List<List<Integer>> 转换为int[][]
int[][] array = new int[graph.size()][];
for (int i = 0; i < graph.size(); i++) {
List<Integer> sublist = graph.get(i);
array[i] = sublist.stream().mapToInt(Integer::intValue).toArray();
}
return array;
}
如果输出不指定int[][]还是List<List> ,后面这一段转换可以不要。
图转为边关系
public static int[][] graph2relation(int[][] graph){
List<List<Integer>> relation = new ArrayList<>();
for (int i = 0; i < graph.length; i++) {
for (int j = 0; j < graph[i].length; j++) {
List<Integer> ls = new ArrayList<>();
//relation的from
ls.add(i);
//relation的to
ls.add(graph[i][j]);
relation.add(ls);
}
}
System.out.println(relation);
//转换
int[][] array = new int[relation.size()][];
for (int i = 0; i < relation.size(); i++) {
List<Integer> sublist = relation.get(i);
array[i] = sublist.stream().mapToInt(Integer::intValue).toArray();
}
return array;
}