Skip to content

Commit 9988251

Browse files
committed
commit
1 parent bc836a9 commit 9988251

File tree

56 files changed

+530
-20
lines changed

Some content is hidden

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

56 files changed

+530
-20
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package minimal_spanning_tree;
2+
3+
public class MSTPrim {
4+
5+
}

.metadata/.plugins/org.eclipse.core.resources/.history/18/e02983974fa700171640e32e5413bb5b

Whitespace-only changes.
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package minimal_spanning_tree;
2+
3+
/**
4+
* 最小生成树的prim算法,从一个节点出发,每次找到与所有加入的节点相邻的节点,权重最小的节点加入,不能形成环。
5+
*
6+
* @author liyafei
7+
*
8+
*/
9+
public class MSTPrim {
10+
11+
}

.metadata/.plugins/org.eclipse.core.resources/.history/43/402bba7c4fa700171640e32e5413bb5b

Whitespace-only changes.
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
eclipse.preferences.version=1
2+
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
3+
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
4+
org.eclipse.jdt.core.compiler.compliance=1.7
5+
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
6+
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
7+
org.eclipse.jdt.core.compiler.source=1.7
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package class04;
2+
3+
import class03.DFS;
4+
5+
public class TopologicalSort {
6+
DFS dfs=new DFS();
7+
8+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package minimal_spanning_tree;
2+
3+
public class MinimalSpanningTree {
4+
5+
}

.metadata/.plugins/org.eclipse.core.resources/.history/89/90e2e96647a700171640e32e5413bb5b

Whitespace-only changes.
Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,169 @@
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+
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+
boolean[] nodeFound;
23+
24+
class Node{
25+
Node pre;
26+
Node link;
27+
String color;
28+
double d; //本节点找到的时间
29+
double f; //本节点结束的时间
30+
int key; //通过key的值判断两个节点是否为同一个节点
31+
int start;
32+
int end;
33+
double weight=1;
34+
}
35+
36+
public void dfs(){
37+
double[][] weis=getWeightArray();
38+
nodeFound=new boolean[weis.length];
39+
for (int i = 0; i < weis.length; i++) {
40+
nodeFound[i]=false;
41+
}
42+
43+
for (int i = 0; i < list.size(); i++) {
44+
Node node=(Node) list.get(i);
45+
while(node!=null){
46+
node.color="WHITE";
47+
node.pre=null;
48+
node=node.link;
49+
}
50+
}
51+
52+
time=0;
53+
for (int i = 0; i < weis.length; i++) {
54+
double[] adjvertex=weis[i]; //第i个节点的相邻节点
55+
Node node=(Node) list.get(i);
56+
if(node.color.equals("WHITE")){
57+
dfsVisit(node,adjvertex);
58+
}
59+
}
60+
61+
62+
// for (int i = 0; i < list.size(); i++) {
63+
// Node node=(Node) list.get(i);
64+
// if(node.color.equals("WHITE")){
65+
// dfsVisit(node);
66+
// }
67+
// }
68+
69+
}
70+
private void dfsVisit(Node node, double[] adjvertex) {
71+
// TODO Auto-generated method stub
72+
time=time+1;
73+
node.d=time;
74+
Node nodeBak=(Node) list.get(node.key);
75+
nodeBak.color="GRAY";
76+
nodeBak=nodeBak.link;
77+
while(nodeBak.color.equals("WHITE")){
78+
nodeBak.pre=node;
79+
dfsVisit(nodeBak, adjvertex);
80+
nodeBak=nodeBak.link;
81+
}
82+
// for (int i = 0; i < adjvertex.length; i++) {
83+
// if(adjvertex[i]){
84+
// dfsVisit(node, adjvertex);
85+
// }
86+
// }
87+
node.color="BLACK";
88+
nodeFound[node.key]=true;
89+
time=time+1;
90+
node.f=time;
91+
92+
}
93+
94+
/**
95+
* 得到创建的带有权重的图,读出相邻节点之间的距离,然后存储到二维数组weights中。
96+
* 权重图的大小比节点多1,但是角标为0的位置都没用,为了处理存储的位置与节点的编号相一致
97+
*/
98+
public double[][] getWeightArray(){
99+
weights=new double[list.size()][list.size()];
100+
for (int i = 0; i < list.size(); i++) {
101+
Node node=(Node) list.get(i);
102+
while(node!=null){
103+
int row=node.start-1;
104+
int col=node.end-1;
105+
double weight=node.weight;
106+
weights[row][col]=weight;
107+
node=node.link;
108+
}
109+
}
110+
return weights;
111+
}
112+
113+
/**
114+
* 打印权重图
115+
*/
116+
public void printWeightGraph(){
117+
double[][] weightsArray=getWeightArray();
118+
for (int i = 0; i < weightsArray.length; i++) {
119+
double[] wa=weightsArray[i];
120+
for (int j = 0; j < wa.length; j++) {
121+
System.out.print(wa[j]+" ");
122+
}
123+
System.out.println();
124+
}
125+
System.out.println();
126+
}
127+
128+
/**
129+
* 创建图,以链表的方式创建图
130+
*
131+
* @return 返回图的链表形式,其中数组中每个位置是一个顶点的链表
132+
*/
133+
// public Node[] createGraph(){
134+
public List createGraph() {
135+
Class clazz = this.getClass();
136+
InputStream ins = clazz.getResourceAsStream("/data1.txt"); // 通过外部数据创建链表,使用/加载src目录下的文件
137+
// 不使用/是加载类路径下的文件
138+
Scanner scanner = new Scanner(ins); // 流输入。
139+
while (scanner.hasNextLine()) {
140+
String s = scanner.nextLine();
141+
Scanner oneLine = new Scanner(s);
142+
Node first = null;
143+
Node newNode = null, last = null;
144+
while (oneLine.hasNext()) {
145+
String s1 = oneLine.next();
146+
int num = Integer.parseInt(s1);
147+
if (num == 999)
148+
break;
149+
newNode = new Node();
150+
newNode.key=num;
151+
newNode.end = num;
152+
newNode.start = count;
153+
newNode.link = null;
154+
if (first == null) {
155+
newNode.end = count;
156+
newNode.weight=0;
157+
first = newNode;
158+
last = newNode;
159+
} else {
160+
last.link = newNode;
161+
last = newNode;
162+
}
163+
}
164+
list.add(first);
165+
count++;
166+
}
167+
return list;
168+
}
169+
}
Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,169 @@
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+
boolean[] nodeFound;
23+
24+
class Node{
25+
Node pre;
26+
Node link;
27+
String color;
28+
double d; //本节点找到的时间
29+
double f; //本节点结束的时间
30+
int key; //通过key的值判断两个节点是否为同一个节点
31+
int start;
32+
int end;
33+
double weight=1;
34+
}
35+
36+
public void dfs(){
37+
double[][] weis=getWeightArray();
38+
nodeFound=new boolean[weis.length];
39+
for (int i = 0; i < weis.length; i++) {
40+
nodeFound[i]=false;
41+
}
42+
43+
for (int i = 0; i < list.size(); i++) {
44+
Node node=(Node) list.get(i);
45+
while(node!=null){
46+
node.color="WHITE";
47+
node.pre=null;
48+
node=node.link;
49+
}
50+
}
51+
52+
time=0;
53+
for (int i = 0; i < weis.length; i++) {
54+
double[] adjvertex=weis[i]; //第i个节点的相邻节点
55+
Node node=(Node) list.get(i);
56+
if(node.color.equals("WHITE")){
57+
dfsVisit(node,adjvertex);
58+
}
59+
}
60+
61+
62+
// for (int i = 0; i < list.size(); i++) {
63+
// Node node=(Node) list.get(i);
64+
// if(node.color.equals("WHITE")){
65+
// dfsVisit(node);
66+
// }
67+
// }
68+
69+
}
70+
private void dfsVisit(Node node, double[] adjvertex) {
71+
// TODO Auto-generated method stub
72+
time=time+1;
73+
node.d=time;
74+
Node nodeBak=(Node) list.get(node.key);
75+
nodeBak.color="GRAY";
76+
nodeBak=nodeBak.link;
77+
while(nodeBak.color.equals("WHITE")){
78+
nodeBak.pre=node;
79+
dfsVisit(nodeBak, adjvertex);
80+
nodeBak=nodeBak.link;
81+
}
82+
// for (int i = 0; i < adjvertex.length; i++) {
83+
// if(adjvertex[i]){
84+
// dfsVisit(node, adjvertex);
85+
// }
86+
// }
87+
node.color="BLACK";
88+
nodeFound[node.key]=true;
89+
time=time+1;
90+
node.f=time;
91+
92+
}
93+
94+
/**
95+
* 得到创建的带有权重的图,读出相邻节点之间的距离,然后存储到二维数组weights中。
96+
* 权重图的大小比节点多1,但是角标为0的位置都没用,为了处理存储的位置与节点的编号相一致
97+
*/
98+
public double[][] getWeightArray(){
99+
weights=new double[list.size()][list.size()];
100+
for (int i = 0; i < list.size(); i++) {
101+
Node node=(Node) list.get(i);
102+
while(node!=null){
103+
int row=node.start-1;
104+
int col=node.end-1;
105+
double weight=node.weight;
106+
weights[row][col]=weight;
107+
node=node.link;
108+
}
109+
}
110+
return weights;
111+
}
112+
113+
/**
114+
* 打印权重图
115+
*/
116+
public void printWeightGraph(){
117+
double[][] weightsArray=getWeightArray();
118+
for (int i = 0; i < weightsArray.length; i++) {
119+
double[] wa=weightsArray[i];
120+
for (int j = 0; j < wa.length; j++) {
121+
System.out.print(wa[j]+" ");
122+
}
123+
System.out.println();
124+
}
125+
System.out.println();
126+
}
127+
128+
/**
129+
* 创建图,以链表的方式创建图
130+
*
131+
* @return 返回图的链表形式,其中数组中每个位置是一个顶点的链表
132+
*/
133+
// public Node[] createGraph(){
134+
public List createGraph() {
135+
Class clazz = this.getClass();
136+
InputStream ins = clazz.getResourceAsStream("/data1.txt"); // 通过外部数据创建链表,使用/加载src目录下的文件
137+
// 不使用/是加载类路径下的文件
138+
Scanner scanner = new Scanner(ins); // 流输入。
139+
while (scanner.hasNextLine()) {
140+
String s = scanner.nextLine();
141+
Scanner oneLine = new Scanner(s);
142+
Node first = null;
143+
Node newNode = null, last = null;
144+
while (oneLine.hasNext()) {
145+
String s1 = oneLine.next();
146+
int num = Integer.parseInt(s1);
147+
if (num == 999)
148+
break;
149+
newNode = new Node();
150+
newNode.key=num;
151+
newNode.end = num;
152+
newNode.start = count;
153+
newNode.link = null;
154+
if (first == null) {
155+
newNode.end = count;
156+
newNode.weight=0;
157+
first = newNode;
158+
last = newNode;
159+
} else {
160+
last.link = newNode;
161+
last = newNode;
162+
}
163+
}
164+
list.add(first);
165+
count++;
166+
}
167+
return list;
168+
}
169+
}

0 commit comments

Comments
 (0)