图-邻接矩阵

带权无向图的邻接矩阵表示法(C语言实现) 带权无向图的邻接矩阵表示法(C语言实现) 文章目录带权无向图的邻接矩阵表示法(C语言实现)一、邻接矩阵表示法二、本次程序实现的功能三、带权无向图的结构体定义四、创建无向图及邻接矩阵五、输出邻接矩阵六、输出顶点集合七、判断两顶点是否邻接八、全部代码九、测试 一、邻接矩阵表示法 ​ 定义:所谓邻接矩阵存储,是指用一个一维数组存储图中顶点的信息,用一个二维数组存储图中边的信息(即各顶点之间的邻接关系),存储顶点之间邻接关系的二维数组称为邻接矩阵。 ​ 对于带权图而言,若顶点Vi 和 Vj 之间有边相连,则邻接 阅读详情

这是一篇关于无向带权图的模板代码整理,用邻接矩阵表示图,实现图的深度优先遍历和广度优先遍历。

也可以改为有向带权图,需要在插入、删除函数作出相应的改变。

邻接矩阵表示图优缺点总结:稠密图用邻接矩阵。

  • 邻接矩阵把所有结点的信息都保留下来,信息保留全面,查询也方便;但,当图中结点的之间联系较少时,这时的邻接矩阵为稀疏矩阵,存储了大量的0或无穷值。信息价值密度低。只有稠密图对应的邻接矩阵才不是稀疏矩阵,因此,复杂的图用邻接矩阵表示为佳。

 

//
//  main.cpp
//  图-邻接矩阵
//
//  Created by scnulpc on 2018/10/22.
//  Copyright © 2018年 scnulpc. All rights reserved.
//

#include <iostream>
#include <queue>
#define maxWeight 99
using namespace std;
const int DefaultVertices = 30;

template <class T,class E>
class Graph     //带权无向图
{
private:
    T * VerticesList;   //顶点表
    E **Edge;           //邻接矩阵
    int maxVertices;    //图中最大顶点数
    int numEdges;       //当前边数
    int numVertices;    //当前顶点数
    
    
public:
    Graph(int sz=DefaultVertices);
    ~Graph();
    int numberOfVertices(){return numVertices;}
    int numberOfEdge(){return numEdges;}
    int getVertexPosition(T v);         //获取顶点v的位置
    T getValue(int i);                  //取顶点i的值,i不合理返回0
    E getWeight(int v1,int v2);         //取边(v1,v2)边上的权值
    int getFirstNeighbor(int v);        //取顶点v的第一个邻接顶点
    int getNextNeighbor(int v,int w);   //取v的邻接顶点w的下一个邻接顶点
    bool insertVertex(const T& vertex); //插入顶点vertex
    bool insertEdge(int v1,int v2,E weight);//插入边
    bool removeVertex(int v);           //删除顶点v及其关联的边
    bool removeEdge(int v1,int v2);     //删除边(v1,v2)
    friend istream& operator>>(istream& in,Graph<T,E> &g);//重载输入
    friend ostream& operator<<(ostream& out,Graph<T,E> &g);//重载输出
    void input();   //测试输入
    void output();  //测试输出
    void outputAsMatrix();  //测试输出
};

template <class T,class E>
Graph<T, E>::Graph(int sz)
{
    VerticesList = new T[sz];
    maxVertices=sz;
    numVertices=0;
    numEdges=0;
    Edge = new E* [sz];
    for (int i=0; i<maxVertices; i++)
    {
        Edge[i] = new E[sz];
    }
    for (int i=0; i<maxVertices; i++)
    {
        for (int j=0; j<maxVertices; j++)
        {
            if (i==j) Edge[i][j]=0;
            else Edge[i][j] = maxWeight;
        }
    }
}
template <class T,class E>
Graph<T, E>::~Graph<T, E>()
{
    delete []VerticesList;
    delete []Edge;
}
template <class T,class E>
int Graph<T,E>::getVertexPosition(T v)
{
    for (int i=0; i<numVertices; i++) {
        if (VerticesList[i]==v)return i;
    }
    return -1;
}
template <class T,class E>
T Graph<T,E>::getValue(int i)
{
    return (i>=0&&i<numVertices)? VerticesList[i]:0;
}
template <class T,class E>
E Graph<T,E>::getWeight(int v1, int v2)
{
    return (v1!=-1&&v2!=-1)? Edge[v1][v2]:0;
}
template <class T,class E>
int  Graph<T,E>::getFirstNeighbor(int v)
{
    if (v!=-1) {
        for (int i=0; i<numVertices; i++) {
            if (Edge[v][i]>0&&Edge[v][i]<maxWeight) return i;
        }
    }
    return -1;
}
template <class T,class E>
int  Graph<T,E>::getNextNeighbor(int v, int w)
{
    if (v!=-1&&w!=-1) {
        for (int column = w+1; column<numVertices; column++) {
            if (Edge[v][column]>0&&Edge[v][column]<maxWeight) return column;
        }
    }
    return -1;
}

template <class T,class E>
bool Graph<T,E>::insertVertex(const T &vertex)
{
    if (numVertices==maxVertices) return false;
    VerticesList[numVertices++]=vertex;
    return true;
}
template <class T,class E>
bool  Graph<T,E>::insertEdge(int v1, int v2, E weight)
{
    if (v1!=-1&&v2!=-1) {
        Edge[v1][v2]=Edge[v2][v1]=weight;
        return true;
    }
    return false;
}
template <class T,class E>
bool Graph<T,E>::removeVertex(int v)    //充分利用要被删除的那一行,那一列的空间,替换为最后一行,一列,numVertex--
{
    if (v<0||v>=numVertices)return false;   //顶点不在图中
    if (numVertices==1) return false;       //只剩一个顶点,不删除
    VerticesList[v]=VerticesList[numVertices-1];//顶点表中删除该结点
    for (int i=0; i<numVertices; i++)
    {
        if (Edge[v][i]>0&&Edge[v][i]<maxWeight)
        {
            //Edge[v][i]=Edge[i][v]=maxWeight;
            numEdges--;
        }
    }
    for (int i=0; i<numVertices; i++)       //用最后一列填补第v列
    {
        Edge[i][v] = Edge[i][numVertices-1];
        Edge[i][numVertices-1] = maxWeight;
    }
    for (int i=0; i<numVertices; i++)       //用最后一行填补第v行
    {
        Edge[v][i]=Edge[numVertices-1][i];
        Edge[numVertices-1][i]=maxWeight;
    }
    Edge[numVertices-1][numVertices-1]=0;   //对角线为0
    numVertices--;                          //顶点数减一
    return true;
}

template <class T,class E>
bool Graph<T,E>::removeEdge(int v1, int v2)
{
    if (v1>-1&&v1<numVertices&&v2>-1&&v2<numVertices&&Edge[v1][v2]>0&&Edge[v1][v2]<maxWeight)
    {
        Edge[v1][v2]=Edge[v2][v1]=maxWeight;
        numEdges--;
        return true;
    }
    return false;
}

template <class T,class E>
istream& operator>>(istream& in,Graph<T, E> &g)
{
    int i,j,k,n,m;
    T e1,e2;
    E weight;
    cout<<"输入顶点数n和变数m"<<endl;
    in>>n>>m;
    cout<<"输入"<<n<<"个顶点的信息"<<endl;
    for (i=0; i<n; i++)
    {
        in>>e1;
        g.insertVertex(e1);
    }
    i=0;
    cout<<"输入"<<m<<"条边的信息\n端点e1 端点e2 权重"<<endl;
    while(i<m)
    {
        in>>e1>>e2>>weight;
        j=g.getVertexPosition(e1);
        k=g.getVertexPosition(e2);
        if (j==-1||k==-1) {
            cout<<"边两端信息有误,重新输入这条边"<<endl;
        }
        else
        {
            g.insertEdge(e1, e2, weight);
        }
    }
    return in;
}
template <class T,class E>
ostream& operator<<(ostream& out,Graph<T, E> &g)
{
    int i,j,n,m;T e1,e2;E w;
    n=g.numberOfVertices();
    m=g.numberOfEdge();
    out<<n<<","<<m<<endl;
    for (i=0; i<n; i++) {
        for (j=i+1; j<n; j++)
        {
            w=g.getWeight(i, j);
            if (w>0&&w<w<maxWeight) {
                e1 = g.getValue(i);
                e2 = g.getValue(j);
                out<<"("<<e1<<","<<e2<<","<<w<<")"<<endl;
            }
        }

    }
    return out;
}
template <class T,class E>
void Graph<T,E>::input()
{
    int i,j,k,n,m;
    T e1,e2;
    E weight;
    cout<<"输入顶点数n和变数m"<<endl;
    cin>>n>>m;
    cout<<"输入"<<n<<"个顶点的信息"<<endl;
    for (i=0; i<n; i++)
    {
        cin>>e1;
        insertVertex(e1);
    }
    i=0;
    cout<<"输入"<<m<<"条边的信息\n端点e1 端点e2 权重"<<endl;
    while(i<m)
    {
        cin>>e1>>e2>>weight;
        j=getVertexPosition(e1);
        k=getVertexPosition(e2);
        if (j==-1||k==-1) {
            cout<<"边两端信息有误,重新输入这条边"<<endl;
        }
        else
        {
            insertEdge(j, k, weight);
            i++;
        }
    }
    
}
template <class T,class E>
void Graph<T,E>::output()
{
    int i,j,n,m;T e1,e2;E w;
    n=numberOfVertices();
    m=numberOfEdge();
    cout<<n<<","<<m<<endl;
    for (i=0; i<n; i++) {
        for (j=i+1; j<n; j++)
        {
            w=getWeight(i, j);
            if (w>0&&w<w<maxWeight) {
                e1 = getValue(i);
                e2 = getValue(j);
                cout<<"("<<e1<<","<<e2<<","<<w<<")"<<endl;
            }
        }
        
    }
    
}
template <class T,class E>
void Graph<T,E>::outputAsMatrix()
{
    int i,j,n,m;T e1,e2;E w;
    n=numberOfVertices();
    m=numberOfEdge();
    cout<<n<<","<<m<<endl;
    cout<<"   ";
    for (int i=0; i<n; i++) {
        cout<<VerticesList[i]<<"  ";
    }
    cout<<endl;
    for (i=0; i<n; i++) {
        cout<<VerticesList[i]<<" ";
        for (j=0; j<n; j++)
        {
            w=getWeight(i, j);
            cout<<w<<" ";
        }
        cout<<endl;
    }
}

//邻接矩阵图的深度优先搜索
template <class T,class E>
void DFS(Graph<T,E> *G,const T v)
{
    int n = G->numberOfVertices();
    bool *visit = new bool[n];
    for (int i=0; i<n; i++)visit[i]=false;
    int index = G->getVertexPosition(v);
    DFS(G, index, visit);
    delete []visit;
        
}
template <class T,class E>
void DFS(Graph<T,E> *G,int v,bool visit[])
{
    cout<<G->getValue(v)<<" ";
    visit[v]=1;
    int w = G->getFirstNeighbor(v);
    while (w!=-1)
    {
        if (visit[w]==false) DFS(G, w, visit);
        w=G->getNextNeighbor(v, w);
    }
}

//邻接矩阵图的广度遍历
template <class T,class E>
void BFS(Graph<T,E> *G,const T v)
{
    int index = G->getVertexPosition(v);
    if (index==-1) return;
    queue<int > q ;
    q.push(index);
    int n = G->numberOfVertices();
    bool *visited = new bool[n];
    for (int i=0; i<n; i++)visited[i]=false;
    visited[index]=true;
    int temp;
    while (!q.empty())
    {
        temp = q.front();q.pop();
        cout<<G->getValue(temp)<<" ";
        
        int w = G->getFirstNeighbor(temp);
        while (w!=-1) {
            if (visited[w]==false) {q.push(w);visited[w]=true;}
            w = G->getNextNeighbor(temp, w);
        }
    }
    
}
/*测试数据 9 10 A B C D E F G H I
 A D 1
 A C 1
 A B 1
 B E 1
 B C 1
 E G 1
 D F 1
 C F 1
 F H 1
 H I 1
 */
int main(int argc, const char * argv[])
{
    Graph<char, int > *graph = new Graph<char, int>(20);
    graph->input();
    graph->output();
    graph->outputAsMatrix();
    DFS(graph, 'A');
    cout<<endl;
    cout<<"广度遍历"<<endl;
    BFS(graph, 'A');
    return 0;
}

 

图 - Java实现无向带权图的邻接矩阵表示法 阅读详情

相关推荐

数据结构 图的邻接矩阵

图的邻接矩阵的存储方式是用两个数组来实现的,一个一维数组存储顶点信息,一个二维数组存储线(无向图)或弧(有向图)的信息。设图G有n个顶点,则邻接矩阵是一个n × n的方阵,定义为:无向图的邻接矩阵,两个顶点有边则为1,否则,为0;因为是无向图arc[i][j] = arc[j][i],所以矩阵为对称矩阵,对角线为自己到自己的边,邻接矩阵中,行之和或者列之和都为各顶点度的总数。设图G有是网图,有n个...

夜雨柠檬 3万+

图

一、图的存储结构 1.邻接矩阵 设图G有n个顶点,则邻接矩阵是一个n*n的方阵,定义为 实例如下,左图是一个无向图,有图是邻接矩阵表示: 看一个有向图案例: 网图:每条边都带权的图叫做网。设图G是网图,有n个顶点,则邻接矩阵是一个n*n的方阵,定义为: 2.邻接表 邻接矩阵是一种不错的图存储结构,但是,对于边数相对顶点较少的图,这种存储结构存在存储空间的极大浪费。...

hhhhhyyyyy8的博客 3543

图的邻接矩阵存储(简单代码实现)

说起来邻接矩阵,对于学过线性代数的同学理解起来非常简单 其实就是一个数字组成方阵,每一个数字都能有有意义的代表一些信息。 下面来看一个例子 如上图所示的图,使用邻接矩阵存储的话应该是下面的情况 由此可见,邻接矩阵存储的无向图必定是对称的 如果是下面的有向图我们该如何表示呢 由行到列看,顶点1到3是连同的,路径的权值是10,而顶点3到1是不连通的所以用数学中的无穷大进行表示。 我相信大家也能够看出来有向图和无向图的区别了 下面用代码来实现带权值的无向图的的存储 存储结构 typedef struct { c

qq_42552006的博客 8653

特殊矩阵、稀疏矩阵表示方式(三元组、伪地址法、邻接表示、十字链式)

一、概念 严版数据结构:特殊矩阵:相同元素或者零元素在矩阵中的分布存在一定规律的矩阵,反之称为稀疏矩阵。 国外:矩阵中绝大多数元素都为0的矩阵称为稀疏矩阵。 二、特殊矩阵存储 一般的特殊矩阵是:对称矩阵、上三角矩阵、下三角矩阵、对角矩阵。 特殊矩阵存储这里列,上、下三角矩阵的存储。对称矩阵是按角对角线对称。 由对称矩阵A[i][j] = A[j][i],所以我们只需要保存一份即可,所需...

hi_sir_destroy的博客 7648

图——邻接矩阵

邻接矩阵:用一个一维数组存放图中所有顶点数据;用一个二维数组存放顶点间关系(边或弧)的数据,这个二维数组称为邻接矩阵。用邻接矩阵表示图,很容易确定图中任意两个顶点是否有边相连。邻接矩阵分为有向图邻接矩阵和无向图邻接矩阵。对无向图(无向简单图)而言,邻接矩阵一定是对称的,而且对角线一定为零,有向图则不一定如此。 “test.cpp” #define _CRT_SECURE_NO_WARN

poison_biti的博客 5577

怎么用python的networkx工具箱将图的邻接矩阵转化为图

邻接矩阵是一个二维数组,其中每个元素 ( A_{ij} ) 表示节点 ( i ) 和节点 ( j ) 之间的连接关系。如果 ( A_{ij} = 1 ),则表示节点 ( i ) 和节点 ( j ) 之间有边相连;如果 ( A_{ij} = 0 ),则表示它们之间没有边相连。对于无向图,邻接矩阵是对称的,即 ( A_{ij} = A_{ji} )。

xiamu_CDA的博客 1089

图还可以这样存——邻接表的数组实现

之前我们介绍过图的邻接矩阵存储法,它的空间和时间复杂度都是N2,现在我来介绍另外一种存储图的方法:邻接表,这样空间和时间复杂度就都是M。对于稀疏图来说,M要远远小于N2。先上数据,如下。 4 5 1 4 9 4 3 8 1 2 5 2 4 6 1 3 7 复制代码         第一行两个整数n m。n表示顶

不可数的爱 ! 5906

图邻接矩阵算法

邻接矩阵比较好理解,这里就不记录了,主要是邻接表,比较难理解,       邻接表存储类型定义:   typedef struct ANode{ int adjvex; //该边的终点编号 struct ANode *nextarc; //指向下一条边的指针 InfoType weight; //该边的权值等信息} ArcNode; typedef struct Vnode{ Vertex data; //顶点信息 ArcNo

孤独的博客 3336

图的邻接矩阵实现

#include<iostream> #define MAXVEX 10/*最大顶点数*/ #define INFINITY 65656/*表示权值无穷*/ using namespace std; typedef int EdgeType; typedef char VertexType; typedef struct { VertexType vexs[MAXVEX]; ...

qq_43527713的博客 1万+

lighttools用透镜旋转手动创建菲尼尔透镜

学过很多软件,都没有留下痕迹,很多年之后只记得学过的软件常用的一些功能,稍微难一些的再次用起需要重新学,但如果留下点痕迹,重新再用就会很快。lighttools无意之中接触了,记一点点笔记吧。...

kingsai2012的博客 4331

机械臂视觉抓取避坑指南:如何正确计算手眼标定矩阵(附Numpy代码)

本文详细解析了机械臂视觉抓取中手眼标定矩阵的计算方法,特别针对'眼在手上'配置下的常见错误提供了解决方案。通过Numpy代码示例和坐标转换原理,帮助开发者避免矩阵计算错误和坐标转换偏差,提升工业自动化系统的精度和效率。

weixin_29081703的博客 243

图的存储 —— 邻接矩阵

图的存储 —— 邻接矩阵

代码改变世界 1万+

Stanford CS230深度学习(一)

斯坦福CS230可以作为深度学习的入门课,最近我也在跟着看视频、完成编程作业。首先列出使用的资源链接,然后给出第一课的理解和编程作业的代码。 所有资料如下: 一、课程连接: b站课堂讲授版:Stanford CS230(吴恩达 深度学习 Deep Learning | Autumn 2018)(中英双字幕) (一共10个视频,每周一个,但是每个视频对应下面的配套视频较多) Coursera配套视...

weixin_44750583的博客 2381

图的邻接矩阵的实现

对于图的一些基本概率和术语的内容汗牛充栋,故本文不会做过多解释。仅仅总结下笔者学习图的邻接矩阵的相关知识邻接矩阵的实现原理邻接矩阵(adjacency matrix)是图ADT最基本的实现方式,使用二维数组A[n][n]来表示由n个顶点构成的图。

不能说的秘密的博客 3万+

销售预测的方法与模型(三)丨安全库存与再订货(补货)

较高的 Z 值对应较高的服务水平(例如,服务水平 99% 对应 Z 值 2.33),意味着企业希望更低的缺货风险,因此需要更高的安全库存。在再订货点的管理中,考虑到供应商交货的不确定性,通常需要结合安全库存,以防止在交货期间库存用尽。要对L开根号,根号L表示交货周期越长,企业需要的安全库存越多,因为在较长的供应期内,需求波动的累积效应更明显。举例:供应商的交期服从标准差为2件/天的正态分布,顾客需求为50件/天的正态分布,若要客户服务水平达到 90%,安全库存量应该是多少?下面介绍几种核心的模型与公式。

weixin_45675709的博客 1535

Python实战:基于PyG和Stable-Baselines3复现柔性车间调度算法(附数据集)

本文提供了一份基于图神经网络与深度强化学习的柔性车间调度实战指南。通过PyTorch Geometric构建异构图表示车间状态,并利用Stable-Baselines3中的PPO算法训练调度智能体,详细介绍了从环境建模、网络设计到训练评估的完整代码实现,帮助开发者构建可复用的工业级智能调度系统。

ansible6ops的博客 608

数据结构之图(二)——邻接矩阵

图的逻辑结构为多对多,图没有顺序存储结构,但可以借助二维数组来表示元素间的关系,即数组表示法(邻接矩阵)。图的链式存储结构可以用多重链表来描述,如邻接表,邻接多重表以及十字链表等。 邻接矩阵 数组(邻接矩阵)表示法: 建立一个邻接表(记录各个顶点信息)和一个邻接矩阵(表示各个顶点间的关系)。 1.设图A=(V,E)有n个顶点,则有顶点表Vexs[n]如下, i 0 1 2 ⋯\cdot...

daocaoren_的博客 9万+

Oracle EBS和华为MetaERP在会计科目(COA)设计上的观察非常精准。这两种设计确实代表了两种截然不同的系统架构思想,我们可以从设计哲学、优劣对比和演进关系三个方面进行深入分析。

OracleEBS与华为MetaERP的COA设计对比分析 OracleEBS采用弹性域架构,通过固定段数字符串实现多维度核算,强调稳定性和全球统一标准,但修改成本高、扩展性受限。华为MetaERP采用解耦架构,将核算单元、自然科目和核算维度分离,支持动态扩展和灵活调整,更适合业务快速变化的企业。 OracleEBS优势在于强一致性和成熟稳定,劣势是灵活性差;华为MetaERP优势是极致灵活性,劣势是对管理要求高。两者代表了不同时代的企业软件设计理念:OracleEBS适合标准化需求,MetaERP则面向快

金牌架构师 430

图的邻接矩阵存储—C语言

代码实现: //图的邻接矩阵存储结构—用两个数组来表示图,一个一维数组存储图中的顶点信息,一个二维数组(称为邻接数组)存储图中的边或弧的信息。 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <iostream> #define MAX_VERTI...

qq_38236355的博客 2840

基于FPGA的7x7矩阵求逆verilog开发

up目录一、理论基础二、核心程序三、测试结果 矩阵求逆,即求矩阵的逆矩阵。矩阵是线性代数的主要内容,很多实际问题用矩阵的思想去解既简单又快捷。逆矩阵又是矩阵理论的很重要的内容,逆矩阵的求法自然也就成为线性代数研究的主要内容之一。设A是数域上的一个n阶方阵,若在相同数域上存在另一个n阶矩B,使得: AB=BA=E。 则我们称B是A的逆矩阵,而A则被称为可逆矩阵。其中,E为单位矩阵。典型的矩阵求逆方法有:利用定义求逆矩阵、初等变换法、伴随阵法、恒等变形法等。 逆矩阵的求法有多种,其中重要

FPGA/MATLAB学习教程/源码/项目合作开发 3898

UG\NX二次开发 获取对象的引用集

获取对象的引用集,一个对象可能有多个引用集,下面这个封装函数可以获取对象的所有引用集。

王牌飞行员_里海的博客 489

图的邻接矩阵

图的邻接矩阵和邻接表 ps:本文主要针对还没有学过数据结构的人群,所以会尽量写得简单易懂,但用词上不一定十分准确。 一般来说,我们保存一个图常用的方法有两种,分别是邻接矩阵和邻接表。 下面我们用这张图来做例子: 这是一张无向图,无向图指的是通路没有方向的图。也就是说,如果点1和点2之间有通路,那么可以从点1到点2,也能从点2到点1。 有向图则是指通路有方向的图。也就是说,如果点1到点2有一条通路...

LinBun的博客 2780

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

用邻接矩阵存储图

邻接矩阵通常采用一个一维数组存储图中节点的信息,采用一个二维数组存储图中节点之间的邻接关系。邻接矩阵可以用来表示无向图、有向图和网。在无向图中,若从节点 Vi 到节点 Vj 有边,则邻接矩阵 M[i][j] = M[j][i ]= 1,否则 M[i][j] = 0。无向图的邻接矩阵的特定如下。a 无向图的邻接矩阵是对称矩阵,并且是唯一的。b 第 I 行或第 i 列非零的个数正好是第 i 个节点的度。在有向图中,若从节点 Vi 到节点 Vj 有边,则邻接矩阵 M[i][j]=1,否则 M[i][j]=0 。有

实践求真知 3121

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

邻接矩阵创建图

邻接矩阵创建图用的二维数组创建图,是用顺序存储结构实现的; 邻接矩阵创建图的过程也就是给二维数组赋值的过程 图的数据结构: public class Graph { String[] vertex = new String[5]; //顶点类型可自定义 int[][] edge = new int[5][5]; //边的类型可自定义 .... //...

欣淡定的博客 4407

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

图的邻接矩阵存储

图的邻接矩阵 图的基本存储方法有两种:邻接矩阵和邻接表 这里简单对邻接矩阵做一个描述(带权有向图) 首先要定义一个图和顶点的结构体 typedef struct//定义顶点的结构体 { int no; //顶点的编号 char info[20]; //顶点的一些信息,看应用而定 }Acme; typedef struct //图的定义 { int edges[Max][Max]...

【chase 667

用邻接矩阵创建图

用一个字符数组vexs[]存储着图的所有顶点,在用一个二维数组arcs[][]存储边的关系,这就是邻接矩阵。另外v表示图的顶点数,e表示图的边数。w表示某条边的权值 对于arcs[i][j]二维数组存储边的关系中,数组的i,j一般都是图的顶点数,即i = j = v;并且例如arcs[i][j] = w 就可以表示为,图存在顶点vexs[i] 到顶点vexs[j]的边,并且权值为w; 另外对于arcs[i][j]随着边的不同可以自行定义其规则。 1.当i = j的时候,arcs[i][j]的权值 2

tanxinji的博客 3471
上一篇: 图论基本概念
下一篇: 图-邻接表
scnulpc
博客等级 码龄10年 3粉丝 35原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值