public class DirectedGraph {
private int vertex;
private int edge;
private LinkedList<Integer>[] adj;
/**
* 内部创建
* @param v 顶点
*/
@SuppressWarnings(
"unchecked")
public DirectedGraph(
int v){
this.vertex = v;
edge =
0;
adj =
new LinkedList[v];
for(
int i=
0;i<v;i++){
adj[i] =
new LinkedList<>();
}
}
/**
* 通过加载文件创建
* @param file
* @throws IOException
*/
@SuppressWarnings(
"unchecked")
public DirectedGraph(File file)
throws IOException{
FileReader fr =
new FileReader(file);
BufferedReader br =
new BufferedReader(fr);
int vertex = Integer.parseInt(br.readLine());
this.vertex = vertex;
adj =
new LinkedList[vertex];
for(
int i=
0;i<vertex;i++){
adj[i] =
new LinkedList<>();
}
int edge = Integer.parseInt(br.readLine());
for(
int i=
0;i<edge;i++){
String[] vertexs = br.readLine().split(
" ");
int v = Integer.parseInt(vertexs[
0]);
int m = Integer.parseInt(vertexs[
1]);
addEdge(v, m);
}
if(br!=
null){
br.close();
}
}
/**
* 添加 一条双向边
* @param v
* @param m
*/
public void addEdge(
int v,
int m){
adj[v].add(m);
edge++;
}
/**
* 获取顶点数
* @return
*/
public int vertexNum(){
return vertex;
}
/**
* 边数
* @return
*/
public int edgeNum(){
return edge;
}
/**
* 返回临界链表迭代器
* @param v
* @return
*/
public Iterable<Integer>
adj(
int v){
return adj[v];
}
/**
* 有向图取反
* @return
*/
public DirectedGraph
reverser(){
DirectedGraph directedGraph =
new DirectedGraph(vertex);
for(
int v =
0;v<vertex;v++){
for(
int w:adj(v)){
directedGraph.addEdge(w, v);
}
}
return directedGraph;
}
}