图的邻接矩阵存储,使用edges存储图中的边信息,二位数组的下标对应边的两个端点。point而用于存储节点信息。
public class MGraph {
int edges[][] = new int[100][100]; //边
int v,e;
int[] point = new int[100]; //节点
//邻接矩阵的遍历
public void disp(){
for(int i = 0; i< e; i ++){
for(int j = 0; j < e; j ++){
System.out.print(edges[i][j]+" ");
}
System.out.println();
System.out.println();
}
}
public static void main(String[] argv){
MGraph g= new MGraph();
int[][] a = new int[][]{
{0,5,0,7,0,0},
{0,0,4,0,0,0},
{8,0,0,0,0,9},
{0,0,5,0,0,6},
{0,0,0,5,0,0},
{3,0,0,0,1,0}
};
g.e = 6;
g.v = 10;
for(int i = 0; i < g.e; i ++){
for(int j = 0; j < g.e; j ++){
g.edges[i][j] = a[i][j];
}
}
System.out.println("图G的邻接矩阵:");
g.disp();
ALGraph al = new ALGraph();
al.MattoLIst(g);
System.out.println("图G的连接表:");
al.disp();
// al.DFS(0);
// al.DFS1(0);
al.BFS(0);
}
}
图的邻接表存储
<pre name="code" class="java">package Graph;
//图的邻接表存储
public class ALGraph {
int[] visit = new int[20];//设置访问数组,将访问过的节点设置为1
Vnode[] list = new Vnode[20];
{
for(int i = 0; i < 20; i++){
list[i] = new Vnode();
}
}
int v,e;
public void disp(){
for(int i = 0; i < e; i ++){
Anode node = list[i].next;
if(node != null)System.out.print(i+": ");
while(node != null){
System.out.print(node.data+" ");
node = node.next;
}
System.out.println();
}
}
//深度优先遍历,递归算法
void DFS(int i){
visit[i] = 1;
System.out.print(i + " ");
Anode node = list[i].next;
while(node != null){
if(visit[node.data] == 0)
DFS(node.data);
node = node.next;
}
}
//深度优先遍历,非递归算法
void DFS1(int i){
for(int j = 0;j < e; j ++) visit[j] = 0;
Anode node = null;
Anode[] nodes = new Anode[20];
int top = -1;
System.out.print(i + " ");
visit[i] = 1;
top ++;
nodes[top] = list[i].next;
while(top > -1){
node = nodes[top];
top --;
while(node != null){
int w = node.data;
if(visit[w] == 0){
System.out.print(w + " ");
visit[w] = 1;
top ++;
nodes[top] = list[w].next;
break;
}
node = node.next;
}
}
}
//广度优先遍历
void BFS(int i){
Anode node = null;
int queue[] = new int[20];
int front = 0,rear = 0;
int[] visited = new int[20];
System.out.print(i + " ");
visited[i] = 1;
rear = (rear + 1) % 20;
queue[rear] = i;
while(front != rear){
front = (front + 1) % 20;
int data = queue[front];
node = list[data].next;
while(node != null){
if(visited[node.data] == 0) {
System.out.print(node.data + " ");
visited[node.data] = 1;
rear = (rear + 1) % 20;
queue[rear] = node.data;
}
node = node.next;
}
}
System.out.println();
}
//将连接矩阵转换为连接表
public void MattoLIst(MGraph mg){
this.v = mg.v;
this.e = mg.e;
// for(int i = 0; i < e; i ++){
// // ag.list[i].next = new Anode();
// ag.list[i].next = null;
// }
for(int i = 0; i < e; i ++){
for(int j = e - 1; j >= 0 ; j--){
if(mg.edges[i][j] != 0){
Anode node= new Anode();
node.data = j;
node.info = mg.edges[i][j];
node.next = list[i].next;
list[i].next = node;
}
}
}
}
}
class Vnode{
int data;
Anode next;
}
class Anode{
int data;
Anode next;
int info;//quan zhi
}