zoukankan      html  css  js  c++  java
  • 图的表示

    最近效率好差好差,大学读多了,人不爱思考了,迟钝了,注意力也很难集中了。总是不能很专心很坚持的去完成一件事情。比如课本,比如作业,比如刷题,即使是电影小说也很难静下心来看完。。。

    图的表示方法:1.邻接矩阵(太简单不讨论) 2.前向星 3.邻接表(动态建表,vector) 4.链式前向星(静态建邻接表表)

    其中链式前向星最好。空间少,可存储重边,可以处理点边数量多的情况,没有动态建表的内存管理所以更安全。除了不能直接用起点终点来确定是否有边外,链式前向星几乎完美。

    View Code
    /********前向星**********/
    //n 点最大值
    //m 边最大值 
    int head[n];
    
    struct Node
    {
        int from;
        int to;
        int w;
    };
    
    Node edge[m];
    
    //对所有边按照起点排序,若起点相同按照终点排序,若终点相同按照权值排序 
    bool cmp(Node a, Node b)
    {
        if (a.from == b.from && a.to == b.to)
            return a.w < b.w;
        if (a.from == b.from)
            return a.to < b.to;
        return a.from < b.from;
    }
    
    //输入存储 
    cin >> n >> m;
    
    for (int i = 0; i < m; ++i)
        cin >> edge[i].from >> edge[i].to >> edge[i].w;
    
    sort(edge, edge+m, cmp);
    
    //确定起点为vi的第一条边出现的位置 
    head[edge[0].from] = 0;
    
    for (int i = 0; i < m; ++i)
        if (edge[i].from != edge[i-1].from)
            head[edge[i].from] = i;
    
    //遍历
    for (int i = 1; i <= n; ++i)    //因为点是v1、v2、v3……所以从1开始 
        for (int k = head[i]; k < m && i == edge[k].from; k++)
            print();
    View Code
    /********邻接表之动态建表**********/
    struct Node//边节点 
    {
        int to;
        int w;
        Node *next;
    };
    
    struct startNode//起点! 
    {
        int from;
        Node *first;
    };
    
    startNode graph[n];
    
    //输入存储
    cin >> i >> j >> w;
    Node *p = new Node();
    p->to = j;
    p->w = w;
    p->next = graph[i].first;
    graph[i].first = p;
    
    //遍历
    for (int i = 1; i <= n; ++i) 
        for (Node *k = graph[i].first; k != NULL; k = k->next)
            print();
    View Code
    View Code
    /*********邻接表之静态建表(链式向前星)************/
    
    //该点的第一条边 
    int head[n];
    
    struct Edge
    {
        int to;//该边的终点
        int w;//该边的权值 
        int next;//该点对应的下一条边 
    };
    //边的集合 
    Edge edges[m];
    
    memset(head, -1, sizeof(head));
    //输入存储
    //k 为当前输入的第k条边 
    cin >> i >> j >> w;
    edges[k].to = j;
    edges[k].w = w;
    edges[k].next = head[i];
    head[i] = k; 
     
    //遍历
    for (int i = 1; i <= n; ++i)
        for (int k = head[i]; k != -1; k = edges[k].next) 
            print();
  • 相关阅读:
    Python 学习笔记 -- 列表的基本使用
    帮助你构建云服务的开源平台:openstack
    一个基于Asterisk构建的VOIP应用软件:Elastix介绍
    Asterisk项目概述
    Asterisk 代码架构概述
    云计算投入成本分析
    撕去服务器虚拟化和云计算的神秘面纱
    VOIP开源项目源码地址
    websocket技术
    JSP页面静态化总结之一使用URLRewrite实现url地址伪静态化
  • 原文地址:https://www.cnblogs.com/chenyg32/p/2798598.html
Copyright © 2011-2022 走看看