图论12-无向带权图及实现

这篇具有很好参考价值的文章主要介绍了图论12-无向带权图及实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

带权图

如何构建无向带权图,图论,图论

1.1带权图的实现

在无向无权图的基础上,增加边的权。

使用TreeMap存储边的权重。

  • 遍历输入文件,创建TreeMap adj存储每个节点。
  • 每个输入的adj节点链接新的TreeMap,存储相邻的边和权重
private TreeMap<Integer, Integer>[] adj;

adj = new TreeMap[V];

for(int i = 0; i < V; i ++)
    adj[i] = new TreeMap<Integer, Integer>();
  • 两条边相连,则分别把权重加入各自的邻接表中
adj[a].put(b, weight);
adj[b].put(a, weight);
  • 判断两点之间是否有边
public boolean hasEdge(int v, int w){
    validateVertex(v);
    validateVertex(w);
    return adj[v].containsKey(w);
}
  • 求相邻的所有节点
public Iterable<Integer> adj(int v){
    validateVertex(v);
    return adj[v].keySet();
}
  • 求两点的权值
public int getWeight(int v, int w){

    if(hasEdge(v, w)) return adj[v].get(w);
    throw new IllegalArgumentException(String.format("No edge %d-%d", v, w));
}
  • 移除边
public void removeEdge(int v, int w){
    validateVertex(v);
    validateVertex(w);
    if(adj[v].containsKey(w)) E --;
    adj[v].remove(w);
    adj[w].remove(v);
}
  • 复制一个图
public Object clone(){

    try{
        WeightedGraph cloned = (WeightedGraph) super.clone();
        cloned.adj = new TreeMap[V];
        for(int v = 0; v < V; v ++){
            cloned.adj[v] = new TreeMap<Integer, Integer>();
            for(Map.Entry<Integer, Integer> entry: adj[v].entrySet())
                cloned.adj[v].put(entry.getKey(), entry.getValue());
        }
        return cloned;
    }
    catch (CloneNotSupportedException e){
        e.printStackTrace();
    }
    return null;
}

1.2 完整代码

package Chapter09_Weight_Graph;

import java.io.File;
import java.io.IOException;
import java.util.Map;
import java.util.TreeMap;
import java.util.Scanner;


/// 暂时只支持无向带权图
public class WeightedGraph implements Cloneable{

    private int V;
    private int E;
    private TreeMap<Integer, Integer>[] adj;

    public WeightedGraph(String filename){

        File file = new File(filename);

        try(Scanner scanner = new Scanner(file)){

            V = scanner.nextInt();
            if(V < 0) throw new IllegalArgumentException("V must be non-negative");
            adj = new TreeMap[V];
            for(int i = 0; i < V; i ++)
                adj[i] = new TreeMap<Integer, Integer>();

            E = scanner.nextInt();
            if(E < 0) throw new IllegalArgumentException("E must be non-negative");

            for(int i = 0; i < E; i ++){
                int a = scanner.nextInt();
                validateVertex(a);
                int b = scanner.nextInt();
                validateVertex(b);
                int weight = scanner.nextInt();

                if(a == b) throw new IllegalArgumentException("Self Loop is Detected!");
                if(adj[a].containsKey(b)) throw new IllegalArgumentException("Parallel Edges are Detected!");

                adj[a].put(b, weight);
                adj[b].put(a, weight);
            }
        }
        catch(IOException e){
            e.printStackTrace();
        }
    }

    public void validateVertex(int v){
        if(v < 0 || v >= V)
            throw new IllegalArgumentException("vertex " + v + "is invalid");
    }

    public int V(){
        return V;
    }

    public int E(){
        return E;
    }

    public boolean hasEdge(int v, int w){
        validateVertex(v);
        validateVertex(w);
        return adj[v].containsKey(w);
    }

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

    public int getWeight(int v, int w){

        if(hasEdge(v, w)) return adj[v].get(w);
        throw new IllegalArgumentException(String.format("No edge %d-%d", v, w));
    }

    public int degree(int v){
        validateVertex(v);
        return adj[v].size();
    }

    public void removeEdge(int v, int w){
        validateVertex(v);
        validateVertex(w);
        if(adj[v].containsKey(w)) E --;
        adj[v].remove(w);
        adj[w].remove(v);
    }

    @Override
    public Object clone(){

        try{
            WeightedGraph cloned = (WeightedGraph) super.clone();
            cloned.adj = new TreeMap[V];
            for(int v = 0; v < V; v ++){
                cloned.adj[v] = new TreeMap<Integer, Integer>();
                for(Map.Entry<Integer, Integer> entry: adj[v].entrySet())
                    cloned.adj[v].put(entry.getKey(), entry.getValue());
            }
            return cloned;
        }
        catch (CloneNotSupportedException e){
            e.printStackTrace();
        }
        return null;
    }

    @Override
    public String toString(){
        StringBuilder sb = new StringBuilder();

        sb.append(String.format("V = %d, E = %d\n", V, E));
        for(int v = 0; v < V; v ++){
            sb.append(String.format("%d : ", v));
            for(Map.Entry<Integer, Integer> entry: adj[v].entrySet())
                sb.append(String.format("(%d: %d) ", entry.getKey(), entry.getValue()));
            sb.append('\n');
        }
        return sb.toString();
    }

    public static void main(String[] args){

        WeightedGraph g = new WeightedGraph("gw1.txt");
        System.out.print(g);
    }
}

如何构建无向带权图,图论,图论文章来源地址https://www.toymoban.com/news/detail-858892.html

到了这里,关于图论12-无向带权图及实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【并集查找 图论 位运算】3108. 带权图里旅途的最小代价

    算法可以发掘本质,如: 一,若干师傅和徒弟互有好感,有好感的师徒可以结对学习。师傅和徒弟都只能参加一个对子。如何让对子最多。 二,有无限多1X2和2X1的骨牌,某个棋盘若干格子坏了,如何在没有坏的格子放足够多骨牌。 三,某个单色图,1表示前前景,0表示后景

    2024年04月15日
    浏览(28)
  • 图论——邻接矩阵之无向网

    在此之前,我们需要先理清图和网的区别 1.图G:有两个集合,边集V和点集E【点集用来存放各个顶点,边集用来存放各条边来表示关联两点的联系】 2.权值:即即两顶点之间互相往来需要花费的代价或消耗 3.网:带权值的图 所谓邻接矩阵,即用矩阵排布的方式来构建两点之间

    2024年02月05日
    浏览(30)
  • 【图论】无向图连通性(tarjan算法)

    1. 连通 : 在图论中,连通性是指一个无向图中的任意两个顶点之间存在路径。如果对于图中的任意两个顶点 u 和 v,存在一条路径从 u 到 v,那么图被称为连通图。如果图不是连通的,那么它可以被分为多个 连通分量 ,每个连通分量都是一个连通子图。 2.割点: 割点(Cut V

    2024年02月13日
    浏览(32)
  • 图论01-【无权无向】-图的基本表示-邻接矩阵/邻接表

    https://github.com/Chufeng-Jiang/Graph-Theory/tree/main/src/Chapt01_Adjacency 代码有删减 代码有删减 只需要改动一行 adj = new TreeSet[V]; //构造邻接表, V行,V个LinkedList 代码有删减

    2024年02月07日
    浏览(32)
  • B3610 [图论与代数结构 801] 无向图的块 题解

    2023 2023 2023 ,再见。 2024 2024 2024 ,你好! 其实就是统计点双连通分量的个数。需要注意的是,孤立点在这里不被看作块。本文使用 tarjan 算法来解决这道题。 概念明晰 时间戳:这里记为 d f n i dfn_i df n i ​ ,表示第一次深度优先搜索到节点 i i i 的时间。时间 t i m e ∈ N + t

    2024年02月03日
    浏览(34)
  • 第三章 图论 No.10无向图的双连通分量

    无向图有两种双连通分量 边双连通分量,e-DCC 点双连通分量,v-DCC 桥:删除这条无向边后,图变得不连通,这条边被称为桥 边双连通分量:极大的不含有桥的连通区域,说明无论删除e-DCC中的哪条边,e-DCC依旧连通 (该连通分量的任意边属于原图中的某条环)。此外,任意两

    2024年02月12日
    浏览(29)
  • 实验12 图论基础

    创建 无向图类 ,存储结构使用邻接链表,提供操作:插入一条边,删除一条边,BFS,DFS。 第一行四个整数n,m,s,t。n ( 10 ≤ n ≤ 100000 10 leq n leq 100000 10 ≤ n ≤ 100000 ) 代表图中点的个数,m ( 10 ≤ m ≤ 200000 10 leq m leq 200000 10 ≤ m ≤ 200000 ) 代表接下来共有m个操作,s代表起

    2024年02月04日
    浏览(21)
  • Python可视化学习——使用JSON进行数据转换、pyecharts模块调用以及可视化案例的介绍(可视化案例数据暂无),柱状图及动态柱状图的构建

    可视化效果一:2020年印美日新冠累计确诊人数 2020年是新冠疫情爆发的一年,随着疫情的爆发,国内外确诊人数成了大家关心的热点,相信大家都有看过类似的疫情报告.本案例对印度美国日本三个国家确诊人数的进行了可视化处理,形成了可视化的疫情确诊人数报告.  可视

    2024年02月01日
    浏览(62)
  • 1.12 力扣中等图论

    797. 所有可能的路径 - 力扣(LeetCode) 给你一个有  n  个节点的  有向无环图(DAG) ,请你找出所有从节点  0  到节点  n-1  的路径并输出( 不要求按特定顺序 )   graph[i]  是一个从节点  i  可以访问的所有节点的列表(即从节点  i  到节点  graph[i][j] 存在一条有向边)

    2024年01月22日
    浏览(20)
  • 12.图论1 最短路之dijkstra算法

    二分图 判定:染色法。 性质: 可以二着色。 无奇圈。 树的直径模板 两遍dfs/bfs,证明时反证法的核心是用假设推出矛盾。 设1是一开始随机选的点,s是与其最远的点,证明s是直径的一端。 反证:假设s不是直径的一端,ss是直径的一端。 现在要做的就是证明ss是直径的一端

    2024年02月20日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包