Skip to content

Commit bc836a9

Browse files
committed
commit
1 parent 4decb83 commit bc836a9

File tree

72 files changed

+5539
-37
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

72 files changed

+5539
-37
lines changed
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
package class03;
2+
3+
4+
import java.io.InputStream;
5+
import java.util.ArrayList;
6+
import java.util.List;
7+
import java.util.Scanner;
8+
9+
import class02.BFS;
10+
import class02.BFS.Node;
11+
12+
/**
13+
* 深度优先搜索,用二维数组(矩阵)将图存储起来,处理起来会更方便一些。
14+
* @author liyafei
15+
*
16+
*/
17+
public class DFS {
18+
List list=new ArrayList();
19+
double[][] weights;
20+
int time;
21+
int count=1;
22+
23+
class Node{
24+
Node pre;
25+
Node link;
26+
String color;
27+
double d; //本节点找到的时间
28+
double f; //本节点结束的时间
29+
int key; //通过key的值判断两个节点是否为同一个节点
30+
int start;
31+
int end;
32+
double weight=1;
33+
}
34+
35+
public void dfs(){
36+
for (int i = 0; i < list.size(); i++) {
37+
Node node=(Node) list.get(i);
38+
node.color="WHITE";
39+
node.pre=null;
40+
}
41+
time=0;
42+
for (int i = 0; i < list.size(); i++) {
43+
Node node=(Node) list.get(i);
44+
if(node.color.equals("WHITE")){
45+
dfsVisit(node);
46+
}
47+
}
48+
49+
}
50+
private void dfsVisit(Node node) {
51+
// TODO Auto-generated method stub
52+
time=time+1;
53+
node.d=time;
54+
Node nodeBak=(Node) list.get(node.key);
55+
nodeBak.color="GRAY";
56+
57+
}
58+
59+
/**
60+
* 得到创建的带有权重的图,读出相邻节点之间的距离,然后存储到二维数组weights中。
61+
* 权重图的大小比节点多1,但是角标为0的位置都没用,为了处理存储的位置与节点的编号相一致
62+
*/
63+
public double[][] getWeightArray(){
64+
weights=new double[list.size()][list.size()];
65+
for (int i = 0; i < list.size(); i++) {
66+
Node node=(Node) list.get(i);
67+
while(node!=null){
68+
int row=node.start-1;
69+
int col=node.end-1;
70+
double weight=node.weight;
71+
weights[row][col]=weight;
72+
node=node.link;
73+
}
74+
}
75+
return weights;
76+
}
77+
78+
/**
79+
* 打印权重图
80+
*/
81+
public void printWeightGraph(){
82+
double[][] weightsArray=getWeightArray();
83+
for (int i = 0; i < weightsArray.length; i++) {
84+
System.out.println();
85+
double[] wa=weightsArray[i];
86+
for (int j = 0; j < wa.length; j++) {
87+
System.out.print(wa[j]+" ");
88+
System.out.println(1);
89+
}
90+
}
91+
System.out.println();
92+
}
93+
94+
/**
95+
* 创建图,以链表的方式创建图
96+
*
97+
* @return 返回图的链表形式,其中数组中每个位置是一个顶点的链表
98+
*/
99+
// public Node[] createGraph(){
100+
public List createGraph() {
101+
Class clazz = this.getClass();
102+
InputStream ins = clazz.getResourceAsStream("/data1.txt"); // 通过外部数据创建链表,使用/加载src目录下的文件
103+
// 不使用/是加载类路径下的文件
104+
Scanner scanner = new Scanner(ins); // 流输入。
105+
while (scanner.hasNextLine()) {
106+
String s = scanner.nextLine();
107+
Scanner oneLine = new Scanner(s);
108+
Node first = null;
109+
Node newNode = null, last = null;
110+
while (oneLine.hasNext()) {
111+
String s1 = oneLine.next();
112+
int num = Integer.parseInt(s1);
113+
if (num == 999)
114+
break;
115+
newNode = new Node();
116+
newNode.key=num;
117+
newNode.end = num;
118+
newNode.start = count;
119+
newNode.link = null;
120+
if (first == null) {
121+
newNode.end = count;
122+
first = newNode;
123+
last = newNode;
124+
} else {
125+
last.link = newNode;
126+
last = newNode;
127+
}
128+
}
129+
list.add(first);
130+
count++;
131+
}
132+
return list;
133+
}
134+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package class03;
2+
3+
public class TestDFS {
4+
public static void main(String[] args) {
5+
DFS dfs=new DFS();
6+
dfs.printWeightGraph();
7+
}
8+
}
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
package class03;
2+
3+
4+
import java.io.InputStream;
5+
import java.util.ArrayList;
6+
import java.util.List;
7+
import java.util.Scanner;
8+
9+
import class02.BFS;
10+
import class02.BFS.Node;
11+
12+
/**
13+
* 深度优先搜索,用二维数组(矩阵)将图存储起来,处理起来会更方便一些。
14+
* @author liyafei
15+
*
16+
*/
17+
public class DFS {
18+
List list=new ArrayList();
19+
double[][] weights;
20+
int time;
21+
int count=1;
22+
23+
class Node{
24+
Node pre;
25+
Node link;
26+
String color;
27+
double d; //本节点找到的时间
28+
double f; //本节点结束的时间
29+
int key; //通过key的值判断两个节点是否为同一个节点
30+
int start;
31+
int end;
32+
double weight=1;
33+
}
34+
35+
public void dfs(){
36+
for (int i = 0; i < list.size(); i++) {
37+
Node node=(Node) list.get(i);
38+
node.color="WHITE";
39+
node.pre=null;
40+
}
41+
time=0;
42+
for (int i = 0; i < list.size(); i++) {
43+
Node node=(Node) list.get(i);
44+
if(node.color.equals("WHITE")){
45+
dfsVisit(node);
46+
}
47+
}
48+
49+
}
50+
private void dfsVisit(Node node) {
51+
// TODO Auto-generated method stub
52+
time=time+1;
53+
node.d=time;
54+
Node nodeBak=(Node) list.get(node.key);
55+
nodeBak.color="GRAY";
56+
57+
}
58+
59+
/**
60+
* 得到创建的带有权重的图,读出相邻节点之间的距离,然后存储到二维数组weights中。
61+
* 权重图的大小比节点多1,但是角标为0的位置都没用,为了处理存储的位置与节点的编号相一致
62+
*/
63+
public double[][] getWeightArray(){
64+
weights=new double[list.size()][list.size()];
65+
for (int i = 0; i < list.size(); i++) {
66+
Node node=(Node) list.get(i);
67+
while(node!=null){
68+
int row=node.start-1;
69+
int col=node.end-1;
70+
double weight=node.weight;
71+
weights[row][col]=weight;
72+
node=node.link;
73+
}
74+
}
75+
return weights;
76+
}
77+
78+
/**
79+
* 打印权重图
80+
*/
81+
public void printWeightGraph(){
82+
double[][] weightsArray=getWeightArray();
83+
System.out.println(1);
84+
for (int i = 0; i < weightsArray.length; i++) {
85+
System.out.println();
86+
double[] wa=weightsArray[i];
87+
for (int j = 0; j < wa.length; j++) {
88+
System.out.print(wa[j]+" ");
89+
}
90+
}
91+
System.out.println();
92+
}
93+
94+
/**
95+
* 创建图,以链表的方式创建图
96+
*
97+
* @return 返回图的链表形式,其中数组中每个位置是一个顶点的链表
98+
*/
99+
// public Node[] createGraph(){
100+
public List createGraph() {
101+
Class clazz = this.getClass();
102+
InputStream ins = clazz.getResourceAsStream("/data1.txt"); // 通过外部数据创建链表,使用/加载src目录下的文件
103+
// 不使用/是加载类路径下的文件
104+
Scanner scanner = new Scanner(ins); // 流输入。
105+
while (scanner.hasNextLine()) {
106+
String s = scanner.nextLine();
107+
Scanner oneLine = new Scanner(s);
108+
Node first = null;
109+
Node newNode = null, last = null;
110+
while (oneLine.hasNext()) {
111+
String s1 = oneLine.next();
112+
int num = Integer.parseInt(s1);
113+
if (num == 999)
114+
break;
115+
newNode = new Node();
116+
newNode.key=num;
117+
newNode.end = num;
118+
newNode.start = count;
119+
newNode.link = null;
120+
if (first == null) {
121+
newNode.end = count;
122+
first = newNode;
123+
last = newNode;
124+
} else {
125+
last.link = newNode;
126+
last = newNode;
127+
}
128+
}
129+
list.add(first);
130+
count++;
131+
}
132+
return list;
133+
}
134+
}

0 commit comments

Comments
 (0)