用java编写请编写程序创建一个有向图。有向图中包含n个顶点,编号为0至n-1。 输入格式: 输入第一行为两个正整数n和e,数字之间用空格分割,分别表示图的顶点数和边数,其中n不超过20000,e不超过20000。接下来e行表示每条边的信息,每行为3个非负整数a、b、c,数字之间用空格分割,其中a和b表示该边的端点编号,c表示权值。各边并非按端点编号顺序排列。 输出格式: 按顶点编号递增顺序输出每个顶点引出的边,每个顶点占一行,若某顶点没有引出边,则不输出。每行表示一个顶点引出的所有边,格式为a:(a,b,w)……,表示有向边a->b的权值为w,a引出的多条边按编号b的递增序排列。
时间: 2024-03-09 09:45:28 浏览: 71
以下是Java代码实现:
```java
import java.util.ArrayList;
import java.util.Scanner;
public class DirectedGraph {
static class Edge {
int from, to, weight;
public Edge(int from, int to, int weight) {
this.from = from;
this.to = to;
this.weight = weight;
}
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
int e = input.nextInt();
ArrayList<Edge>[] graph = new ArrayList[n];
for (int i = 0; i < n; i++) {
graph[i] = new ArrayList<Edge>();
}
for (int i = 0; i < e; i++) {
int a = input.nextInt();
int b = input.nextInt();
int c = input.nextInt();
graph[a].add(new Edge(a, b, c));
}
for (int i = 0; i < n; i++) {
if (graph[i].size() > 0) {
System.out.print(i + ":");
graph[i].sort((e1, e2) -> e1.to - e2.to);
for (Edge edge : graph[i]) {
System.out.print("(" + edge.from + "," + edge.to + "," + edge.weight + ")");
}
System.out.println();
}
}
}
}
```
首先,我们定义了一个静态内部类 Edge,表示一条边,包含起点、终点和权值。然后,我们读入图的顶点数和边数,并创建一个 ArrayList 数组 graph,用来存储每个顶点引出的边。接着,我们遍历每条边,将其添加到起点所在的 ArrayList 中。最后,我们按顶点编号递增顺序输出每个顶点引出的边,如果某个顶点没有引出边,则不输出。
时间复杂度为 O(e log e),其中 e 为边数。
阅读全文