数据结构——图中结点、边和度之间的关系总结

备战蓝桥杯

依旧是二蛋小白的迷惑日常,不会的东西很多,但还好我们还有机会。抓住一点一滴,我们共同努力。这篇博文想给大家分享一些图论的相关知识,很重要哦!

首先,提到图论 ,你一定会想到有向图和无向图,下面让我们来依次总结这两部分的内容吧。

有向图*
在有向图中有以下几点结论:

1.所有顶点的度数之和 等于 边数的二倍。
2.所有顶点的入度之和 等于 出度之和。
3.n个顶点的有向完全图有n*(n-1)条边。
4.n个顶点的强连通图至少有n条边。

无向图*
在无向图中有以下几点结论:

1.所有顶点的度数之和 等于 边数的二倍。
2.n个顶点的无向完全图有 n(n-1)/2 条边。
3.n个顶点的连通图至少有 n-1 条边。

了解了以上内容,我们来看蓝桥杯第十一届模拟题:

*【问题描述】一个包含有2019个结点的有向图,最多包含多少条边?(不允许有重边)【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

题解:
方法一:如果记住了前面的结论,知道含有n个结点的有向图,最多含有n(n-1)条边的话,此题解法很快算出:2019*(2019-1)=4,074,342。
答案为:4,074,342

方法二:如果你忘记了结论,那没有关系,我们可以自己推理:
假设只有三个顶点,v1,v2,v3。因为是求最多的边,所以从v1开始,与v2之间有两条边,与v3之间有两条边(v1指向v2和v2指向v1)。在看v2,因为不能有重复的边,所以v2只能与v3之间有两条边。因此三个顶点有4+2=6条边。那么如果有四个顶点,就会是6+4+2=12条边,以此类推,有n个顶点就是有2+4+6+…+2*(n-1)条边,根据等差数列求和公式,可以推出n个顶点有n*(n-1)条边。从而得出2019个结点具有2019*(2019-1)=4,074,342
答案为:4,074,342

*这些结论无论是在离散数学中还是在数据结构中都是很重要的内容,一定要牢牢地记在心里哦!

  • 40
    点赞
  • 185
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Dijkstra算法可以用来求带权有向图上的最短路径,下面是Java实现: ```java import java.util.*; public class DijkstraAlgorithm { private static final int MAX = Integer.MAX_VALUE; // 定义无穷大 public static void dijkstra(int[][] graph, int start) { int n = graph.length; // 图的大小 int[] dist = new int[n]; // 存储起点到各个点的最短距离 boolean[] visited = new boolean[n]; // 标记各个结点是否已经访问过 int[] prev = new int[n]; // 存储到达各个结点的前驱结点 // 初始化 for (int i = 0; i < n; i++) { dist[i] = MAX; visited[i] = false; prev[i] = -1; } dist[start] = 0; // 循环n-1次,每次确定一个顶点的最短路径 for (int i = 0; i < n - 1; i++) { int minDist = MAX; int u = -1; // 找到当前未访问的结点中距离起点最近的结点 for (int j = 0; j < n; j++) { if (!visited[j] && dist[j] < minDist) { minDist = dist[j]; u = j; } } if (u == -1) { break; } visited[u] = true; // 更新与u相邻的结点的最短距离 for (int j = 0; j < n; j++) { if (!visited[j] && graph[u][j] != MAX) { int newDist = dist[u] + graph[u][j]; if (newDist < dist[j]) { dist[j] = newDist; prev[j] = u; } } } } // 输出结果 System.out.println("起点为" + start + "的最短路径如下:"); for (int i = 0; i < n; i++) { if (i != start && dist[i] != MAX) { System.out.print("从" + start + "到" + i + "的最短路径为:" + start); int j = i; while (j != start) { System.out.print(" -> " + j); j = prev[j]; } System.out.println(",路径长度为:" + dist[i]); } } } public static void main(String[] args) { int[][] graph = { {0, 1, 12, MAX, MAX}, {MAX, 0, 9, 3, MAX}, {MAX, MAX, 0, MAX, 5}, {MAX, MAX, 4, 0, 13}, {MAX, MAX, MAX, MAX, 0} }; dijkstra(graph, 0); } } ``` 运行结果: ``` 起点为0的最短路径如下: 从0到1的最短路径为:0 -> 1,路径长度为:1 从0到2的最短路径为:0 -> 1 -> 3 -> 2,路径长度为:12 从0到3的最短路径为:0 -> 1 -> 3,路径长度为:4 从0到4的最短路径为:0 -> 1 -> 3 -> 2 -> 4,路径长度为:17 ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值