邻接矩阵

c++实验9 图及图的操作实验

我的梦境 提交于 2020-03-08 04:24:49
实验9 图及图的操作实验 --博客后半部分有程序的所有代码-- 1、图邻接矩阵存储结构表示及基本操作算法实现 (1)邻接矩阵存储结构类定义: #include "SeqList.h" //包含动态数组结构的顺序表类 #include "SeqQueue.h" //包含静态数组结构的顺序队列类 typedef char VerT; //定义邻接矩阵图类中的VerT class AdjMWGraph { private: SeqList Vertices; //顶点顺序表 int Edge[MaxVertices][MaxVertices]; //边权值数组 double numOfEdges; //边的个数 void DepthFirstSearch(const int v, int visited[]); void BroadFirstSearch(const int v, int visited[]); public: AdjMWGraph(const int sz=MaxVertices); //构造函数 ~AdjMWGraph(void){}; //析构函数 int NumOfVertices(void) //取顶点个数 {return Vertices.Size();} int NumOfEdges(void) //取边的个数 {return numOfEdges;}

普里姆算法与修路问题

橙三吉。 提交于 2020-02-22 12:07:46
应用场景-修路问题 看一个应用场景和问题: 有胜利乡有7个村庄(A, B, C, D, E, F, G) ,现在需要修路把7个村庄连通 各个村庄的距离用边线表示(权) ,比如 A – B 距离 5公里 问:如何修路保证各个村庄都能连通,并且总的修建公路总里程最短? 最小生成树 修路问题本质就是就是最小生成树问题, 先介绍一下最小生成树 (Minimum Cost Spanning Tree),简称MST。 给定一个带权的无向连通图,如何选取一棵生成树,使树上所有 边上权的总和为最小 ,这叫最小生成树 N个顶点,一定有N-1条边 包含全部顶点 N-1条边都在图中 举例说明(如图:) 求最小生成树的算法主要是 普里姆 算法和克鲁斯卡尔算法 思路: 将10条边,连接即可,但是总的里程数不是最小. 正确的思路 ,就是尽可能的选择少的路线,并且每条路线最小,保证总里程数最少. 普里姆算法介绍 普利姆(Prim)算法求最小生成树,也就是在包含n个顶点的连通图中,找出只有(n-1)条边包含所有n个顶点的连通子图,也就是所谓的 极小连通子图 普利姆的算法如下: 设G=(V,E)是连通网,T=(U,D)是最小生成树,V,U是顶点集合,E,D是边的集合 若从顶点u开始构造最小生成树,则从集合V中取出顶点u放入集合U中,标记顶点v的visited[u]=1 若集合U中顶点ui与集合V

图的创建,图的深度优先遍历和广度优先遍历

柔情痞子 提交于 2020-02-21 19:53:20
图 图的表现形式: 邻接矩阵:使用二维数组,行列表示各个顶点,使用规定的数来表示两个顶点之间是否存在边。 例如: 上面就是上面图的邻接矩阵,其中0代表无连接,1代表链接。 除了使用邻接矩阵,还可以使用邻接表表示,邻接表就是针对每一个顶点有一个链表,该链表指向了每一个可以链接的顶点。所有顶点的链表构成的数组。 JAVA构建图: // 存储图的顶点 private List < String > vertexList ; // 邻接矩阵 private int [ ] [ ] edges ; // 边的条数 private int numOfEdges ; // 标记顶点是否有被访问过 private boolean [ ] isVisited ; // 初始化一个n个顶点的图 public Graph ( int n ) { edges = new int [ n ] [ n ] ; vertexList = new ArrayList < String > ( n ) ; } /** * 添加图的边 * * @param v1 第一个顶点下标 * @param v2 第二个顶点下标 * @param weight 权值 */ public void insertEdge ( int v1 , int v2 , int weight ) { // 构建的无向图 edges [ v1

图--邻接矩阵

邮差的信 提交于 2020-02-21 06:58:59
邻接矩阵 图的学习我仍然有许多不懂的地方,所有我先聊聊我比较了解的邻接矩阵。 图的邻接矩阵的存储方式是用两个数组来表示图。 一个一维数组存储图中顶点信息,一个二维数组存储图中的边的信息。 若图G有n个顶点,那这个邻接矩阵就是一个n*n的方阵: 当i=j时,G[i] [j]=0; 当i=a;j=b时,G[i][j]=c; 反之,G[i][j]=无限大(通常取999999999) 其中,c表示a地到b地的权值。 邻接矩阵的的存储结构: # define INFINITY 999999999; typedef struct { int v [ 1000 ] ; int arc [ 1000 ] [ 1000 ] ; int n , m ; //图中的顶点数和边数 } MGraph ; 邻接矩阵可以作用于最小生成树的prim算法。 int i , j ; for ( i = 0 ; i < b ; i ++ ) { for ( j = 0 ; j < b ; j ++ ) { if ( i == j ) G [ i ] [ j ] = 0 ; else G [ i ] [ j ] = 999999999 ; } } for ( i = 0 ; i < a ; i ++ ) { int n , m , h ; scanf ( "%d%d%d" , & n , & m , & h ) ; G

图论基本知识

こ雲淡風輕ζ 提交于 2020-02-16 14:28:45
本文主要参考于《离散数学及其应用》(傅彦 著)中的图论篇 图 图的基本概念 图的定义 一个 图(graph) 是一个序偶 < V , E > <V, E> < V , E > ,记为 G = < V , E > G = <V, E> G = < V , E > ,其中: (1) V = v 1 , v 2 , . . . , v n V = { v_1, v_2, ..., v_n} V = v 1 ​ , v 2 ​ , . . . , v n ​ 是有限非空集合, v i v_i v i ​ 称为 节点(nodal point) ,简称 点(point) , V V V 称为 节点集(nodal set) . (2) E E E 是有限集合,称为 边集(frontier set) , E E E 中的每个元素都有 V V V 中的节点对与之对应,称之为 边(edge) . 图的表示 图的集合表示 图的图形表示 图的矩阵表示 优点:便于用代数知识来研究图的性质,特别是便于用计算机来处理。 邻接矩阵(adjacency matrix) : 设图 G = < V , E > G = <V, E> G = < V , E > , 其中 V = v 1 , v 2 , . . . , v n V = {v_1, v_2, ..., v_n} V = v 1 ​ , v 2 ​ , . .

图的实现(邻接矩阵)及DFS、BFS

倖福魔咒の 提交于 2020-02-10 00:45:02
@author QYX 写作时间:2013/0302 最近准备noi比赛,加油!!! 因为近期学习任务太多太紧,所以我主要维护Github,博客园可能会停更几天。----2020年2月9日 图 图(graph)是用线连接在一起的顶点或节点的集合,即两个要素:边和顶点。每一条边连接个两个顶点,用(i,j)表示顶点为 i 和 j 的边。 ​ 如果用图示来表示一个图,一般用圆圈表示顶点,线段表示边。有方向的边称为有向边,对应的图成为有向图,没有方向的边称为无向边,对应的图叫无向图。对于无向图,边(i, j)和(j,i)是一样的,称顶点 i 和 j 是邻接的,边(i,j)关联于顶点 i 和 j ;对于有向图,边(i,j)表示由顶点 i 指向顶点 j 的边,即称顶点 i 邻接至顶点 j ,顶点 i 邻接于顶点 j ,边(i,j)关联至顶点 j 而关联于顶点 i 。 ​ 对于很多的实际问题,不同顶点之间的边的权值(长度、重量、成本、价值等实际意义)是不一样的,所以这样的图被称为加权图,反之边没有权值的图称为无权图。所以,图分为四种:加权有向图,加权无向图,无权有向图,无权无向图。 图的表现有很多种,邻接表法,临接矩阵等。 图经常是以这种形式出现的[weight,from,to]的n*3维数组出现的,见名知意,三个元素分别为边的权重,从哪儿来,到哪儿去。 如上图所示,由一条边连接在一起的顶点称为

图神经网络 | (6) 图分类(SAGPool)实战

落爺英雄遲暮 提交于 2020-02-04 02:28:00
近期买了一本图神经网络的入门书,最近几篇博客对书中的一些实战案例进行整理,具体的理论和原理部分可以自行查阅该书,该书购买链接: 《深入浅出的图神经网络》 。 该书配套代码 本节我们通过代码来实现基于自注意力的池化机制(Self-Attention Pooling)。来对图整体进行分类,之前我们是对节点分类,每个节点表示一条数据,学习节点的表示,进而完成分类,本节我们通过自注意力池化机制,得到整个图的表示,进而对全图进行分类(每个图表示一条数据)。 导入必要的包 import os import urllib import torch import torch.nn as nn import torch.nn.init as init import torch.nn.functional as F import torch.utils.data as data import torch.optim as optim import numpy as np import scipy.sparse as sp from zipfile import ZipFile from sklearn.model_selection import train_test_split import pickle import pandas as pd import torch_scatter #注意

数据结构复习 ---- 邻接矩阵

会有一股神秘感。 提交于 2020-01-31 19:52:55
一、邻接矩阵的定义 这里要总结的邻接矩阵时关于图的邻接矩阵;图的邻接矩阵(Adjacency Matrix)存储方式是用两个数组来表示图;一个一维数组存储图中顶点信息,一个二维数组(称为邻接矩阵)存储图中的边或弧的信息; 图分为有向图和无向图,其对应的邻接矩阵也不相同,无向图的邻接矩阵是一个对称矩阵,就是一个对称的二位数组,a[i][j] = a[j][i]; 邻接矩阵可以清楚的知道图的任意两个顶点是否有边;方便计算任意顶点的度(包括有向图的出度和入度);可以直观的看出任意顶点的邻接点; 二、邻接矩阵的存储结构 vexs[MAXVEX]这是顶点表;arc[MAXVEX][MAXVEX]这是邻接矩阵,也是存储每条边信息的二位数组,索引是边的两个顶点,数组的数据是边的权值;numVertexes, numEdges分别为图的顶点数和边数; # define MAXVEX 20 # define INFINITY 0 //用于初始化时填充邻接矩阵 typedef struct Graph { char vexs [ MAXVEX ] ; int arc [ MAXVEX ] [ MAXVEX ] ; int numVertexes , numEdges ; } * pGraph ; 三、建立邻接矩阵 先建立顶点表,然后初始化邻接矩阵,最后将每条边的信息写入邻接矩阵

图的基本操作

给你一囗甜甜゛ 提交于 2020-01-29 11:08:08
文章目录 图的基本操作 邻接矩阵 邻接表 图的基本操作 邻接矩阵 # include <iostream> using namespace std ; # define MaxVertexNum 100 # define INFINITY 65532 typedef int Vertex ; typedef int WeightType ; typedef char DataType ; typedef struct GNode * PtrToGNode ; //图结点的定义 struct GNode { int Nv ; int Ne ; WeightType G [ MaxVertexNum ] [ MaxVertexNum ] ; DataType Data [ MaxVertexNum ] ; } ; typedef PtrToGNode MGraph ; //边的定义 typedef struct ENode * PtrToENode ; struct ENode { Vertex v1 , v2 ; WeightType weight ; } ; typedef PtrToENode Edge ; MGraph CreateGraph ( int vertexnum ) { Vertex v , w ; MGraph Graph ; Graph = ( MGraph )

用邻接矩阵和邻接表创建图

十年热恋 提交于 2020-01-28 16:14:18
#include <iostream> using namespace std; #define INFINITY 65536//无穷大 #define MAX_VERTEX_NUM 10//最大顶点个数 typedef enum{DG,DN,UDG,UDN}GraphKind;//有向图,有向网,无向图,无向网 struct Graph { char vexs[MAX_VERTEX_NUM];//储存顶点 int arc[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//邻接矩阵 int vexnum, arcnum;//顶点数和边(弧)数 GraphKind kind;//图的种类 }; //确定顶点序号 int LocateVex(Graph *G, char ch) { for (int i = 0; i < G->vexnum; i++) if (G->vexs[i] == ch) { return i;//返回顶点序号 break; } return -1; } void CreateUDN(Graph *G)//创建无向网 { int i, j; char v1, v2;//记录顶点名称 int w;//记录权值 cout << "请输入顶点个数:" << endl;cin >> G->vexnum; cout << "请输入边的个数:" <<