数据结构:图

本文详细探讨了图数据结构的概念,包括图的定义、类型(有向图与无向图)、节点与边的关系,以及图的常用操作如深度优先搜索和广度优先搜索。通过实例解析,帮助读者掌握图在解决实际问题中的应用。
摘要由CSDN通过智能技术生成
package graph;

import java.util.Iterator;
import java.util.Scanner;

public class Graph {
    private final int V;  //顶点数目
    private int E;  //边的数目
    private Bag<Integer>[] adj; //邻接表

    public Graph(int V) {
        this.V=V;
        adj=(Bag<Integer>[])new Bag[V];  //创建邻接表
        for (int i = 0; i < V; i++) {  //将所有邻接表初始化为空
            adj[i]=new Bag<>();
        }
    }

    public Graph(Scanner sc) {
        this(sc.nextInt());  //读取V并将图初始化
        int E=sc.nextInt();  //读取E
        for (int i = 0; i < E; i++) {
            int v=sc.nextInt();  //读取一个顶点
            int w=sc.nextInt();  //读取另一个顶点
            addEdge(v, w); //添加一条连接它们的边
        }
    }

    public int V(){
        return V;
    }

    public int E(){
        return E;
    }

    public void addEdge(int v,int w){
        adj[v].add(w);  //将w添加到v的链表中
        adj[w].add(v);  //将v添加到w的链表中
        E++;
    }

    public Iterable<Integer> adj(int v){
        return adj[v];
    }

    @Override
    public String toString() {
        String s=V+"vertices, "+E+" edges\n";
        for (int i = 0; i < V; i++) {
            s+=i+":";
            for (int w : adj(i)) {
                s+=w+" ";
            }
            s+="\n";
        }
        return s;
    }

    //一个单向链表
    static class Bag<Item> implements Iterable<Item>{
        private Node first;  //链表的首节点
        private class Node{
            Item item;
            Node next;
        }

        public void add(Item item){
            Node oldFirst=first;
            first=new Node();
            first.item=item;
            first.next=oldFirst;
        }

        @Override
        public Iterator<Item> iterator() {
            // TODO Auto-generated method stub
            return new ListIterator();
        }

        private class ListIterator implements Iterator<Item> {
            private Node current=first;

            @Override
            public boolean hasNext() {
                // TODO Auto-generated method stub
                return current!=null;
            }

            @Override
            public Item next() {
                // TODO Auto-generated method stub
                Item item=current.item;
                current=current.next;
                return item;
            }

            public void remove(){

            }

        }
    }
}
package graph;

public class Graphs {

    //计算顶点v的度数
    public static int degree(Graph G,int v){
        int degree=0;
        for (int w : G.adj(v)) {
            degree++;
        }
        return degree;
    }

    //计算所有顶点的最大度数
    public static int maxDegree(Graph G){
        int max=0;
        for (int i = 0; i < G.V(); i++) {
            if (degree(G, i)>max) {
                max=degree(G, i);
            }
        }
        return max;
    }

    //计算所有顶点的平均度数
    public static double avgDegree(Graph G){
        return 2.0*G.E()/G.V();
    }

    //计算自环的个数
    public static int numberOfSelfLoops(Graph G){
        int count=0;
        for (int i = 0; i < G.V(); i++) {
            for (int w : G.adj(i)) {
                if (i==w) {
                    count++;
                }
            }
        }
        return count/2;  //每条边都被记过两次
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值