图 遍历 java_java中图的遍历

/*class Queue {

private int[] values;

private int begin = -1;

private int end = -1;

Queue(int size) {

values = new int[size];

}

void push(int value) {values[++begin] = value;}

int pop() { return values[++end]; }

boolean isEmpty() { return begin == end; }

}*/

class Vertex {

private Object value;

private boolean isVisited;

private int weight;

Vertex(Object value) {

this.value = value;

}

void visit() { isVisited = true; print(); }

//void clean() { isVisited = false; }

boolean isVisited() { return isVisited; }

void print() { System.out.print(value+"→"); }

}

public  class Graph {

private Vertex[] vertexs;

private int[][] adjMat;

private int pos = -1;

int sum=0;

int last=0;

Graph(int size) {

vertexs = new Vertex[size];

adjMat = new int[size][size];

}

void add(Object value) {

//assert pos < vertexs.length;

vertexs[++pos] = new Vertex(value);

adjMat[pos][pos]=10000;

}

void connect(int from, int to,int weight) {

adjMat[from][to] = weight;

adjMat[to][from] = weight;

}

/*void disConnect(int from, int to) {

adjMat[from][to] = 0;

adjMat[to][from] = 0;

}*/

int findNeighbor(int index) {

int min=10000,i,j=0;

for( i=0; i<=pos;i++ )

if(!(vertexs[i].isVisited()))

if(adjMat[index][i]

min=adjMat[index][i];

j=i;

}

return j;

}

/* void bfs(int index) { //从指定下标的节点开始广度优先遍历

if(vertexs[index] == null) return; //如果图中没有指定下标节点,则退出

Queue q=new Queue(vertexs.length); //创建队列存放访问过的节点

vertexs[index].visit(); //访问指定节点

q.push(index); //将节点推入队列中

while(!q.isEmpty()) { //队列为空则表示遍历结束

index = q.pop(); //取出队头

int i;

while(((i=findNeighbor(index)) != -1)&&(!(vertexs[i].isVisited()))) { //寻找头节点的所有邻接节点

vertexs[i].visit(); //标记访问过的邻接节点

q.push(i); //放入队列中

}

}

}*/

/* void routsum(Graph g,int index){

int i, sum=0;

for()

while(((i=findNeighbor(index)) != -1)&&(!(vertexs[i].isVisited()))){

sum+=g.adjMat[index][i];

}

System.out.println(sum);

}*/

void dfs(Graph g,int index){ //从指定下标的节点开始深度优先遍历

vertexs[index].visit();

int i=0 ;

while(((i=findNeighbor(index)) != -1)&&(!(vertexs[i].isVisited()))){

sum += g.adjMat[index][i];

dfs(g,i);

if(findNeighbor(i)==index)last=i;

i=findNeighbor(i);

}

}

//void clean() { for(Vertex v: vertexs) if(v != null)v.clean(); }

public static void main(String[] args) {

Graph g = new Graph(20);

g.add('a');

//System.out.println(g.adjMat[0][0]);

g.add('b');

g.add('c');

g.add('d');

g.add('e');

g.connect(0, 1, 4);

g.connect(0, 2, 6);

g.connect(0, 3, 7);

g.connect(0, 4, 16);

g.connect(1, 2, 3);

g.connect(1, 3, 4);

g.connect(1, 4, 19);

g.connect(2, 3, 11);

g.connect(2, 4, 10);

g.connect(3, 4, 3);

g.dfs(g,0);

g.vertexs[0].visit();

System.out.print("所走路程共:"+(g.sum+g.adjMat[0][g.last])+"单位");

//System.out.print(g.adjMat[0][g.last]);

}

}

分享到:

18e900b8666ce6f233d25ec02f95ee59.png

72dd548719f0ace4d5f9bca64e1d7715.png

2009-12-21 20:14

浏览 4236

评论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值