//图类的创建
public class Graph {
//顶点数
private final int V;
//边的总数
private int Lines;
private ArrayList<ArrayList<Integer>> table;
public Graph(int v) {
V = v;
Lines=0;
table= new ArrayList<ArrayList<Integer>>();
for (int i = 0; i <v ; i++) {
table.add(new ArrayList<Integer>());
}
}
public int getV() {
return V;
}
public int getLines() {
return Lines;
}
public void addEdge(int m,int n){
table.get(m).add(n);
table.get(n).add(m);
Lines++;
}
public ArrayList<Integer> RelatedV(int v){
return table.get(v);
}
}
//深度搜索
public class DepthFirst {
public boolean[] marked;
private int count;//查找所有与该点相通的点
public DepthFirst(Graph G,int goal){
marked = new boolean[G.getV()];
count=0;
df(G, goal);
}
private void df(Graph G,int goal){
marked[goal]=true;
for (Integer m: G.RelatedV(goal)) { //八皇后路径问题,有for才有多条路径因为for存在才会有反向回溯,没for最多只有一条
if (marked[m]==false){
df(G, m);
}
}
count++; //count++的位置值得想想
}
//判断是否与当前节点连通
public boolean marked(int x){
return marked[x];
}
public int getCount() {
return count;
}
}
//广度
public class WidthFirst {
boolean[] marked;
int count;
LinkedList<Integer> waitSearch;
public WidthFirst(Graph g,int goal){
marked=new boolean[g.getV()];
count=0;
waitSearch=new LinkedList<Integer>();
WidthFirstSearch(g, goal);
}
public void WidthFirstSearch(Graph g,int flag){
// waitSearch.addFirst(flag);
// while (!waitSearch.isEmpty()){
// Integer head = waitSearch.removeFirst();
// if (marked[head]==false){
// System.out.print(head+"->");
// marked[head]=true;
// count++;
// }
// ArrayList<Integer> list = g.RelatedV(head);
// for (int i = 0; i < list.size() ; i++) {
// if (marked[list.get(i)]==false) {
// waitSearch.addLast(list.get(i));
// // marked[list.get(i)]=true; 要么进队的时候设置,要么出队设置,不要弄混淆,否则这个数永远都不会被打印
// }
// }
// }
waitSearch.addLast(flag);
while (!waitSearch.isEmpty()){
Integer first = waitSearch.removeFirst();
if (marked[first]==false){
marked[first]=true;
count++;
}
ArrayList<Integer> list = g.RelatedV(first);
for (int i = 0; i <list.size() ; i++) {
Integer content = list.get(i);
if (marked[content]==false){
waitSearch.addLast(content);
}
}
}
}
public boolean remarked(int x){
return marked[x];
}
}
图的广度,深度搜索
最新推荐文章于 2024-05-16 03:38:47 发布