• 《洛谷深入浅出基础篇》 图的基本应用


    什么是图?

    我们在生活中学习中能看见很多图,地图,路线图,思维导图等等,它们都有一个特点,

    你从中任找一个点,你可以找到,从这个点出发,能够到达什么地方,也许不能到达任何地方。

    以这个点为终点,有哪些点能到达这个点。

    利用图,我们可以有方向地去到每一个点。也能找到去到这个点最短的方法。

    图的建立:

    下面建立一个简单的图,来描述一些图的基本术语

    无向图:

    在这副地图之中,每个建筑物被称作:顶点

    每对建筑物之间连接的小路叫做:边

    走这条边需要花费的时间叫做:边权

     像这样的,一条路可以让两座建筑的人互相通行,不具有方向性的图,叫做无向图。

    在无向图中,每个顶点所连接的边数,叫做每个顶点的度数。

    有向图:

    像这样的,一条路只允许一种方向的人通过,如果要两座建筑物之间互相往来,那么需要再建立一条单向路。这样的图叫做有向图。 

    如果两个顶点之间有不止一条边直接连接,就称为重边。

    如果一条边的起点和终点是相同的,就称为自环。

    图的存储

    方法一:邻接矩阵(无重边)

    也就是建立一个二维矩阵 v[i][j] 代表,以i为起点,j为终点,的边权,如果v[i][j]=0说明i到j没有直接的路相连。

    缺点就是,将图存入的时候,用到二重循环,假设有n个顶点,我们需要o(n^2)的空间复杂度,,遍历的时候,也是o(n^2)的时间复杂度。

    方法二:邻接表

    邻接矩阵和邻接表的区别就是,邻接表只存放具有边的顶点。减少了不必要的存放次数。

    下面是邻接表的实现:

    1,建立一个结构体,里面有两个变量,to,cost

    分别代表,终点,边权。

    2.建立一个二维vector   ,    vector p [maxn]

    每当读入一条边的<起点u,终点v,边权l> 用  p[u] .push_back((edge){ v,l}) 

    1. using namespace std;
    2. const int MAXN = 1005;
    3. struct place {
    4. int to, cost;
    5. };
    6. vector p[MAXN];
    7. int v[MAXN][MAXN];
    8. int main()
    9. {
    10. int n,m;
    11. cin >> n>>m;
    12. while (m--)
    13. {
    14. int u, v, l;
    15. cin >> u >> v >> l;
    16. p[u].push_back({ v, l });
    17. }
    18. for (int i = 1; i <= n; i++) {
    19. for (int j = 0; j < p[i].size(); j++) {
    20. v[i][p[i][j].to] = p[i][j].cost;
    21. }
    22. }
    23. for(int i = 1; i <= n; i++)
    24. {
    25. for (int j = 1; j <= n; j++)
    26. cout << v[i][j] << ' ';
    27. cout << endl;
    28. }
    29. }

  • 相关阅读:
    QString格式化
    如何避免在编码层面产生质量事故
    从token中获取用户信息
    Mybatis日志系统
    【多线程】多线程面试常见基础内容
    进程
    更健康舒适更科技的照明体验!SUKER书客护眼台灯 L1上手体验
    Nginx的高可用集群
    项目的一些难点
    c语言基础知识帮助理解(函数递归详解)
  • 原文地址:https://blog.csdn.net/louisdlee/article/details/134499173