数据结构图以及BFS算法

图的实现代码:

1. Graph class

public class Graph {
    public ArrayList<String> vertex;//图的顶点用一个集合存储
    public int[][] EdgeWeight;//表示邻接矩阵
    public int NumOfEdge;//用来表示边的数量
    public boolean[] visited;//用来记录已经访问过的顶点

    //构造器
    public Graph(int n){
        vertex=new ArrayList<String>();
        //若顶点值有n个,那么其邻接矩阵便是n*n
        EdgeWeight=new int[n][n];
        NumOfEdge=0;
        visited=new boolean[n];
    }

    /**
     * 添加顶点的方法
     * @param vertexs 定义顶点如:A B C ...
     */
    public void inserVertex(String vertexs){
        vertex.add(vertexs);
    }

    /**
     * 编写一个无向图添加边的方法
     * @param v1 第一个顶点
     * @param v2 第二个顶点
     * @param weight 顶点1与顶点2之间是否连接(权值)连接为1,不连接为为0
     */
    public void insertEdge(int v1,int v2,int weight){
        EdgeWeight[v1][v2]=weight;//这边要赋值两次,想想邻接矩阵的结构
        EdgeWeight[v2][v1]=weight;
        NumOfEdge++;
    }

    //编写一个根据序号显示顶点值的方法
    public String getVertexValue(int i){
        return vertex.get(i);
    }
    //编写一个可以得到顶点个数的方法
    public int getNumOfVertex(){
        return vertex.size();
    }
    //编写一个可以得到边的数目的方法
    public int getNumOfEdge() {
        return NumOfEdge;
    }

    //编写一个显示邻接矩阵的方法
    public void show(){
        for (int[] edgeweight:EdgeWeight){
            System.err.println(Arrays.toString(edgeweight));
        }
    }
}

2. DemoMain(主方法):

public class DemoMain {
    public static void main(String[] args) {
        int n=5;//定义顶点个数
        String[] vertexs={"A","B","C","D","E"};
        Graph graph = new Graph(n);
        //添加顶点
        for (String vertex : vertexs) {
            graph.inserVertex(vertex);
        }
        //添加边
        //A-B A-C  B-C B-D B-E
        graph.insertEdge(0,1,1);
        graph.insertEdge(0,2,1);
        graph.insertEdge(1,2,1);
        graph.insertEdge(1,3,1);
        graph.insertEdge(1,4,1);

        //显示邻接矩阵
        graph.show();
    }
}

BFS代码实现

1.Graph class

public class Graph {
    public ArrayList<String> vertex;//图的顶点用一个集合存储
    public int[][] EdgeWeight;//表示邻接矩阵
    public int NumOfEdge;//用来表示边的数量
    public boolean[] visited;//用来记录已经访问过的顶点

    //构造器
    public Graph(int n){
        vertex=new ArrayList<String>();
        //若顶点值有n个,那么其邻接矩阵便是n*n
        EdgeWeight=new int[n][n];
        NumOfEdge=0;
        visited=new boolean[n];
    }

    /**
     * 添加顶点的方法
     * @param vertexs 定义顶点如:A B C ...
     */
    public void inserVertex(String vertexs){
        vertex.add(vertexs);
    }

    /**
     * 编写一个无向图添加边的方法
     * @param v1 第一个顶点
     * @param v2 第二个顶点
     * @param weight 顶点1与顶点2之间是否连接(权值)连接为1,不连接为为0
     */
    public void insertEdge(int v1,int v2,int weight){
        EdgeWeight[v1][v2]=weight;//这边要赋值两次,想想邻接矩阵的结构
        EdgeWeight[v2][v1]=weight;
        NumOfEdge++;
    }

    //编写一个根据序号显示顶点值的方法
    public String getVertexValue(int i){
        return vertex.get(i);
    }
    //编写一个可以得到顶点个数的方法
    public int getNumOfVertex(){
        return vertex.size();
    }
    //编写一个可以得到边的数目的方法
    public int getNumOfEdge() {
        return NumOfEdge;
    }

    //编写一个显示邻接矩阵的方法
    public void show(){
        for (int[] edgeweight:EdgeWeight){
            System.err.println(Arrays.toString(edgeweight));
        }
    }
     /**
     * 广度优先搜索遍历
     * @param edgeWeight 邻接矩阵
     * @param v 顶点
     */
    public void bfs(int [][] edgeWeight,int v){
        //定义一个辅助的队列
        LinkedList<Integer> queue = new LinkedList<>();
        queue.addLast(v);//先把顶点加入到队列中
        visited[v]=true;
        //这边肯定要写一个循环
        while(!queue.isEmpty()) {
            for (int w = 0; w < edgeWeight.length; w++) {
                if (edgeWeight[queue.getFirst()][w] == 1 && !visited[w]) {
                    queue.addLast(w);
                    visited[w] = true;//将已经遍历过的顶点置为true
                }
            }
            System.out.println(getVertexValue(queue.getFirst()));//得到队列中第一个的值
            queue.removeFirst();//将队列中的第一个值取出
        }
    }

    //重载bfs
    public void bfs(){
        bfs(EdgeWeight,2);
    }
}

2.DemoMain class

public class DemoMain {
    public static void main(String[] args) {
       int n=6;//定义顶点个数
        String[] vertexs={"A","B","C","D","E","F"};
        Graph graph = new Graph(n);//new 一个Graph的对象graph
        //添加顶点
        for (String vertex : vertexs) {
            graph.inserVertex(vertex);
        }
       //添加边
        //A-B A-C  B-C B-D B-E
        /*
        graph.insertEdge(0,1,1);
        graph.insertEdge(0,2,1);
        graph.insertEdge(1,2,1);
        graph.insertEdge(1,3,1);
        graph.insertEdge(1,4,1);
         */
        
        graph.insertEdge(0,1,1);
        graph.insertEdge(0,2,1);
        graph.insertEdge(0,5,1);
        graph.insertEdge(1,2,1);
        graph.insertEdge(2,4,1);
        graph.insertEdge(2,3,1);
        graph.insertEdge(3,4,1);
        graph.insertEdge(3,5,1);

        //显示邻接矩阵
        graph.show();
        System.out.println("==========");
        //调用bfs算法
        graph.bfs();
    }
}

  • 13
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
BFS(Breadth-First-Search,广度优先搜索)是一种常用的图遍历算法,其基本思想是从图的某一结点出发,依次访问其所有相邻的结点,再依次访问这些相邻结点的未被访问过的相邻结点,直到所有结点都被访问为止。 以下是BFS算法的C语言实现: ```c #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #define MAX_VERTICES 100 // 最大顶点数 #define MAX_QUEUE_SIZE 100 // 最大队列长度 typedef struct { int front, rear; // 队头和队尾指针 int data[MAX_QUEUE_SIZE]; // 队列数组 } Queue; // 初始化队列 void initQueue(Queue *q) { q->front = q->rear = 0; } // 判断队列是否为空 bool isQueueEmpty(Queue *q) { return q->front == q->rear; } // 入队 void enqueue(Queue *q, int value) { if ((q->rear + 1) % MAX_QUEUE_SIZE == q->front) { printf("队列已满,无法入队!\n"); return; } q->data[q->rear] = value; q->rear = (q->rear + 1) % MAX_QUEUE_SIZE; } // 出队 int dequeue(Queue *q) { if (isQueueEmpty(q)) { printf("队列为空,无法出队!\n"); return -1; } int value = q->data[q->front]; q->front = (q->front + 1) % MAX_QUEUE_SIZE; return value; } // 遍历图 void bfs(int graph[][MAX_VERTICES], int start, int numVertices) { bool visited[MAX_VERTICES] = { false }; // 标记顶点是否被访问过 Queue q; initQueue(&q); visited[start] = true; printf("%d ", start); enqueue(&q, start); while (!isQueueEmpty(&q)) { int vertex = dequeue(&q); for (int i = 0; i < numVertices; i++) { if (graph[vertex][i] && !visited[i]) { // 如果相邻顶点未被访问过 visited[i] = true; printf("%d ", i); enqueue(&q, i); } } } } int main() { int graph[MAX_VERTICES][MAX_VERTICES] = { {0, 1, 1, 0, 0}, {1, 0, 0, 1, 1}, {1, 0, 0, 1, 0}, {0, 1, 1, 0, 1}, {0, 1, 0, 1, 0} }; int numVertices = 5; int start = 0; bfs(graph, start, numVertices); return 0; } ``` 以上代码中,使用了一个循环数组实现队列,使用了一个visited数组记录顶点是否被访问过。函数bfs遍历整个图并输出遍历结果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值