无向图的邻接矩阵和邻接表实现各种操作 -- C++语言描述

hbase数据导入hdfs中之(使用MapReduce编程统计hbase库中的mingxing表中男女数量) 数据 zhangfenglun,M,20,13522334455,zfl@163.com,23521472 chenfei,M,20,13684634455,cf@gmail.com,84545472 liyuchen,M,20,13522334255,lyc@163.com,84765472 liuwei,M,20,13528734455,lw@qq.com,84521765 liuyang,M... 阅读详情
一:实现代码
#ifndef _GRAPH_H
#define _GRAPH_H

#include <iostream>
#include <string.h>
using namespace::std;

///////////////////////////////////////////////////////////////////////////////////////////
//通用图结构
template <typename T>
class graph{
public:
	bool is_empty()const;
	bool is_full()const;
	
	int get_numvertices()const;    //当前顶点数
	int get_numedges()const;       //当前边数
public:
	virtual bool insert_vertex(const T&) = 0;            //插入顶点
	virtual bool insert_edge(const T&, const T&) = 0;    //插入边

	virtual bool remove_vertex(const T&) = 0;            //删除定点
	virtual bool remove_edge(const T&, const T&) = 0;    //删除边

	virtual int get_firstneighbor(const T&)const = 0;    //得到第一个邻接顶点
	virtual int get_nextneighbor(const T&, const T&)const = 0;    //某邻接顶点的下一个邻接顶点
	
	virtual void print_graph()const = 0;
	virtual int get_vertex_index(const T&)const = 0;     //得到顶点序号
protected:
	static const int VERTICES_DEFAULT_SIZE = 10;         //默认图顶点数
	int max_vertices;
	int num_vertices;
	int num_edges;
};

template <typename T>
bool graph<T>::is_empty()const
{
	return num_edges == 0;
}

template <typename T>
bool graph<T>::is_full()const
{
	return num_vertices >= max_vertices 
		   || num_edges >= max_vertices*(max_vertices-1)/2;    //判满,分为顶点满和边满
}

template <typename T>
int graph<T>::get_numvertices()const
{
	return num_vertices;
}

template <typename T>
int graph<T>::get_numedges()const
{
	return num_edges;
}

///////////////////////////////////////////////////////////////////////////////////////////

#define VERTICES_DEFAULT_SIZE graph<T>::VERTICES_DEFAULT_SIZE //派生类继承父类,若父类为模板,派生类不可直接调用父类保护成员
#define num_vertices          graph<T>::num_vertices            //以宏来代替每个位置写作用域的做法
#define num_edges             graph<T>::num_edges
#define max_vertices          graph<T>::max_vertices //另一种方法派生类内定义自己成员函数,可用using graph<T>::num_edges,在类外则不可

///////////////////////////////////////////////////////////////////////////////////////////
//图的邻接矩阵表示法
template <typename T>
class graph_mtx : public graph<T>{
public:
	graph_mtx(int);                   
	graph_mtx(int (*)[4], const int);         //矩阵构造
	
	~graph_mtx();                             
public:
	bool insert_vertex(const T&);
	bool insert_edge(const T&, const T&);  
	
	bool remove_vertex(const T&); 
	bool remove_edge(const T&, const T&); 

	int get_firstneighbor(const T&)const;
	int get_nextneighbor(const T&, const T&)const;
	
	int get_vertex_index(const T&)const;
	void print_graph()const;
private:
	T* vertices_list;                        //顶点线性表
	int **edge;                              //内部矩阵
};

template <typename T>
graph_mtx<T>::graph_mtx(int sz = VERTICES_DEFAULT_SIZE)
{
	max_vertices = sz > VERTICES_DEFAULT_SIZE ? sz 
									: VERTICES_DEFAULT_SIZE;
	vertices_list = new T[max_vertices];

	edge = new int*[max_vertices];                    //动态申请二维数组
	for(int i=0; i<max_vertices; ++i){	
		edge[i] = new int[max_vertices];
		memset(edge[i], 0, sizeof(int)*max_vertices); //清空图
	}

	num_vertices = 0;
	num_edges = 0;
}

template <typename T>
graph_mtx<T>::graph_mtx(int (*mt)[4], const int arr_size)
{
	int edge_count = 0;
	max_vertices = arr_size > VERTICES_DEFAULT_SIZE ? arr_size 
											: VERTICES_DEFAULT_SIZE;
	vertices_list = new T[max_vertices];

	edge = new int*[max_vertices];
	for(int i=0; i<max_vertices; ++i){
		edge[i] = new int[max_vertices];
		memset(edge[i], 0, sizeof(int)*max_vertices);
	}

	for(int i=0; i<arr_size; ++i)
		for(int j=0; j<arr_size; ++j){
			edge[i][j] = mt[i][j];
			if(mt[i][j] != 0)
				++edge_count;
		}
	
	num_vertices = arr_size;
	num_edges = edge_count / 2;      
}

template <typename T>
graph_mtx<T>::~graph_mtx()
{
	for(int i=0; i<max_vertices; ++i)
		delete []edge[i];                     //分别析构,再总析构
	
	delete edge;
	delete []vertices_list;
}

template <typename T>
bool graph_mtx<T>::insert_vertex(const T& vert)
{
	if(this->is_full())                       //派生类函数调用父类函数,用this或加作用域
		return false;
	vertices_list[num_vertices++] = vert;
	return true;
}

template <typename T>
bool graph_mtx<T>::insert_edge(const T& vert1, const T& vert2)
{
	if(this->is_full())                       //判满
		return false;

	int index_v1 = get_vertex_index(vert1);   //得到顶点序号
	int index_v2 = get_vertex_index(vert2);

	if(index_v1 == -1 || index_v2 == -1 )
		return false;
	
	edge[index_v1][index_v2] = edge[index_v2][index_v1] = 1;    //无向图
	++num_edges;	
	
	return true;
}

template <typename T>
bool graph_mtx<T>::remove_vertex(const T& vert)          //用最后一个节点直接覆盖删除的节点,转化为删除最后一个节点
{
	int edge_count = 0;
	int index = get_vertex_index(vert);

	if(index == -1)
		return false;
	
	for(int i=0; i<num_vertices; ++i){
		if(edge[index][i] != 0)
			++edge_count;
	}
	
	if(index != num_vertices-1){
		vertices_list[index] = vertices_list[num_vertices-1];

		for(int i=0; i<num_vertices; ++i){                     //此处两个循环不可合并,因为要分别执行,否则右下角数据出错
			edge[index][i] = edge[num_vertices-1][i];
		}
		for(int i=0; i<num_vertices; ++i){
			edge[i][index] = edge[i][num_vertices-1];
		}
	}

	for(int i=0; i<num_vertices; ++i){
		edge[num_vertices-1][i] = 0;
		edge[i][num_vertices-1] = 0;
	}
	
	--num_vertices;
	num_edges -= edge_count;
	
	return true;
}

template <typename T>
bool graph_mtx<T>::remove_edge(const T& vert1, const T& vert2)
{
	int index_v1 = get_vertex_index(vert1);
	int index_v2 = get_vertex_index(vert2);

	if(index_v1 == -1 || index_v2 == -1)
		return false;

	edge[index_v1][index_v2] = edge[index_v2][index_v1] = 0;
	--num_edges;

	return true;
}

template <typename T>
int graph_mtx<T>::get_firstneighbor(const T& vert)const
{
	int index = get_vertex_index(vert);

	if(index != -1){
		for(int i=0; i<num_vertices; ++i){
			if(edge[index][i] != 0)
				return i;
		}
	}
	return -1;
}

template <typename T>
int graph_mtx<T>::get_nextneighbor(const T& vert1, const T& vert2)const
{
	int index_v1 = get_vertex_index(vert1);
	int index_v2 = get_vertex_index(vert2);

	if(index_v1 != -1 && index_v2 != -1){
		for(int i=index_v2+1; i<num_vertices; ++i){
			if(edge[index_v1][i] != 0)
				return i;
		}
	}
	return -1;
}

template <typename T>
int graph_mtx<T>::get_vertex_index(const T& vert)const
{
	for(int i=0; i<num_vertices; ++i){
		if(vertices_list[i] == vert)
			return i;
	}
	return -1;
}

template <typename T>
void graph_mtx<T>::print_graph()const
{
	if(this->is_empty()){
		cout << "nil graph" << endl;                      //空图输出nil
		return;
	}
	
	for(int i=0; i<num_vertices; ++i){
		cout << vertices_list[i] << "  ";
	}
	cout << endl;

	for(int i=0; i<num_vertices; ++i){
		for(int j=0; j<num_vertices; ++j)
			cout << edge[i][j] << "  ";
		cout << vertices_list[i] << endl;
	}
}

///////////////////////////////////////////////////////////////////////////////////////////
//图的邻接表表示法
template <typename T>
struct node{                                              //节点用来存储与它相连接的顶点
	int dest;
	struct node* link;
	node(int d) : dest(d), link(nullptr) {}
};

template <typename T>
struct vertex{                                            //顶点结构体
	T vert;                                               //顶点
	struct node<T>* adj;                                  //指向描述其他节点的链表
	vertex() : vert(T()), adj(nullptr) {}
};

template <typename T>
class graph_lnk : public graph<T>{
public:
	graph_lnk(int);
	~graph_lnk(); 
public:
	bool insert_vertex(const T& vert);
	bool insert_edge(const T& vert1, const T& vert2);

	bool remove_vertex(const T& vert); 
	bool remove_edge(const T& vert1, const T& vert2); 

	int get_firstneighbor(const T& vert)const; 
	int get_nextneighbor(const T& vert1, const T& vert2)const;
	
	void print_graph()const; 
	int get_vertex_index(const T& vert)const;
protected:
	void remove_point_self(const int, const int);
	void modify_point_self(const int, const int, const int);
private:
	vertex<T>* vertices_table;	
};

template <typename T>
graph_lnk<T>::graph_lnk(int sz = VERTICES_DEFAULT_SIZE)
{
	max_vertices = sz > max_vertices ? sz : VERTICES_DEFAULT_SIZE;
	vertices_table = new vertex<T>[max_vertices];                 //不用再清空,结构体构造函数已清空

	num_vertices = 0;
	num_edges = 0;
}

template <typename T>
graph_lnk<T>::~graph_lnk()
{
	for(int i=0; i<max_vertices; ++i){
		auto tmp = vertices_table[i].adj;
		auto next_tmp = tmp;

		while(tmp != nullptr){           //删除节点
			next_tmp = tmp->link;
			delete tmp;
			tmp = next_tmp;
		}
	}
	delete []vertices_table;            //删除表
}

template <typename T>
bool graph_lnk<T>::insert_vertex(const T& vert)
{
	if(this->is_full())
		return false;

	vertices_table[num_vertices++].vert = vert;

	return true;
}

template <typename T>
bool graph_lnk<T>::insert_edge(const T& vert1, const T& vert2)
{
	if(this->is_full())
		return false;
	
	int index_v1 = get_vertex_index(vert1);
	int index_v2 = get_vertex_index(vert2);

	if(index_v1 == -1 || index_v2 == -1)
		return false;

	auto tmp = vertices_table[index_v1].adj;
	while(tmp != nullptr){
		if(tmp->dest == index_v2)
			return false;
		tmp = tmp->link;
	}
	
	tmp = new node<T>(index_v2);                    //采用前插法,比尾插法效率高,省事
	tmp->link = vertices_table[index_v1].adj;
	vertices_table[index_v1].adj = tmp;

	tmp = new node<T>(index_v1);
	tmp->link = vertices_table[index_v2].adj;
	vertices_table[index_v2].adj = tmp;

	++num_edges;

	return true;
}

template <typename T>
bool graph_lnk<T>::remove_vertex(const T& vert)
{
	int index = get_vertex_index(vert);
	int edge_count = 0;

	if(index == -1)
		return false;

	auto tmp = vertices_table[index].adj;
	auto next_tmp = tmp;
	
	while(tmp != nullptr){
		remove_point_self(index, tmp->dest);       //删除目标顶点指向自己的节点   
		++edge_count;                              //记录边数
		next_tmp = tmp->link;
		delete tmp;
		tmp = next_tmp;	
	}

	if(index != num_vertices-1){
		vertices_table[index].adj = vertices_table[num_vertices-1].adj;     //用最后一个顶点覆盖要删除的顶点
		vertices_table[index].vert = vertices_table[num_vertices-1].vert;
	}

	tmp = vertices_table[index].adj;
	while(tmp != nullptr){
		modify_point_self(tmp->dest, num_vertices-1, index);                //调整原指向最后一个顶点的节点,使其指向新的位置
		tmp = tmp->link;
	}
	
	--num_vertices;
	num_edges -= edge_count;

	return true;
}

template <typename T>
bool graph_lnk<T>::remove_edge(const T& vert1, const T& vert2)
{
	int index_v1 = get_vertex_index(vert1);
	int index_v2 = get_vertex_index(vert2);

	if(index_v1 == -1 || index_v2 == -1)
		return false;

	remove_point_self(index_v1, index_v2);                //相互删除指向自己的节点,相当于删除边
	remove_point_self(index_v2, index_v1);

	return true;
}

template <typename T>
int graph_lnk<T>::get_firstneighbor(const T& vert)const
{
	int index = get_vertex_index(vert);

	if(index != -1 && vertices_table[index].adj != nullptr){    //第一个结点即为所求
		return vertices_table[index].adj->dest;
	}
	return -1;
}

template <typename T>
int graph_lnk<T>::get_nextneighbor(const T& vert1, const T& vert2)const    //目标结点的下一个邻接节点即为所求
{
	int index_v1 = get_vertex_index(vert1);
	int index_v2 = get_vertex_index(vert2);

	if(index_v1 != -1 && index_v2 != -1){
		auto tmp = vertices_table[index_v1].adj;
		
		while(tmp != nullptr && tmp->dest != index_v2)
			tmp = tmp->link;
		
		if(tmp->dest == index_v2 && tmp->link != nullptr)
			return tmp->link->dest;
	}
	return -1;
}

template <typename T>
void graph_lnk<T>::remove_point_self(const int self_index, const int other_index)       //删除指向自己的结点
{
	auto tmp = vertices_table[other_index].adj;
	auto pre_tmp = tmp;
	
	while(tmp->dest != self_index){
		pre_tmp = tmp;
		tmp = tmp->link;
	}
	
	if(pre_tmp == tmp)
		vertices_table[other_index].adj = tmp->link;
	else
		pre_tmp->link = tmp->link;

	delete tmp;
}

template <typename T>
void graph_lnk<T>::modify_point_self(const int other_index, 
								     const int old_index, const int new_index)         //调整原指向最后一个顶点的节点,使其指向新的位置
{
	auto tmp = vertices_table[other_index].adj;

	while(tmp->dest != old_index){
		tmp = tmp->link;
	}
	tmp->dest = new_index;
}

template <typename T>
int graph_lnk<T>::get_vertex_index(const T& vert)const
{
	for(int i=0; i<num_vertices; ++i){
		if(vertices_table[i].vert == vert)
			return i;
	}
	return -1;
}

template <typename T>
void graph_lnk<T>::print_graph()const
{
	if(this->is_empty()){
		cout << "nil graph" << endl;
		return ;
	}
	
	for(int i=0; i<num_vertices; ++i){
		cout << vertices_table[i].vert << " : ";

		auto tmp = vertices_table[i].adj;
		while(tmp != nullptr){
			cout << tmp->dest << "-->";
			tmp = tmp->link;
		}
		cout << "nil" << endl;
	}
}

#endif
二:相关测试代码
1.邻接矩阵测试代码
#include "graph.h"

#define VERTEX_SIZE 4

int main()
{
    int mtx[][VERTEX_SIZE] = {{0,1,0,1},
                              {1,0,1,0},
                              {0,1,0,1},
                              {1,0,1,0}};
	//graph_mtx<int> gm(mtx, VERTEX_SIZE);
	
	graph_mtx<char> gm;
	gm.insert_vertex('A');
	gm.insert_vertex('B');
	gm.insert_vertex('C');
	gm.insert_vertex('D');

	gm.insert_edge('A', 'B');
	gm.insert_edge('A', 'D');
	gm.insert_edge('B', 'C');
	gm.insert_edge('C', 'D');

	//cout << gm.get_firstneighbor('A') << endl;
	//cout << gm.get_nextneighbor('A', 'B') << endl;
	
	//gm.remove_vertex('B');
	gm.remove_edge('A', 'B');

	gm.print_graph();

	return 0;
}*/
部分测试结果:

2.邻接表测试代码
#include "graph.h"

#define VERTEX_SIZE 4

int main()
{
    graph_lnk<char> gl;

    gl.insert_vertex('A');
    gl.insert_vertex('B');
    gl.insert_vertex('C');
    gl.insert_vertex('D');

    gl.insert_edge('A','B');
    gl.insert_edge('A','C');
    gl.insert_edge('B','D');
	gl.print_graph();

	cout << "-------------after remove-------------" << endl;
	gl.remove_vertex('A');
	gl.print_graph();
	
	//gl.remove_edge('A', 'B');
	//gl.print_graph();

	cout << gl.get_firstneighbor('A') << endl;
	cout << gl.get_nextneighbor('A', 'C') << endl;

	return 0;
}
部分测试结果:
上文所有代码均经过测试,图中并未给全。

Prim(普里姆)算法求最小生成树(邻接矩阵) 一、项目功能、方案选择及性能描述: 功能: 1.列出目标系统具有的各个功能,并简述其作用 建立无向图: 输入点的数目和标识、边的数目及其权值,使用二维数组的方式建立无向图并用邻接矩阵的方式进行存储。 找出最小生成树: 从输入的起始点开始,使用Prim算法来寻找最小生成树,并输出树的结点和边。 构造辅助数组: 设置一个一维数组每寻找一个顶点,清空一次,得到最小权值的顶点下标。 画出连通图: 使用EasyX画出之前输入的无向图及标记边的权值。 演示Prim算法: 逐步演示Prim算法的寻找过程,并把得到的最小. 阅读详情

相关推荐

邻接矩阵实现图的构造 (包含有向图和无向图) 实现 插入或者删除 顶点、边

代码与相关注释如下: #include<iostream> #include<cstring> #include<math.h> #include<stdio.h> #include<stdlib.h> #include<conio.h> #include<vector> #include<queue> #include<stack> using namespace std; const int ma

牛大春の博客 3100

【论文阅读】YOLO-X:Exceeding YOLO Series in 2021

题目:YOLOX: Exceeding YOLO Series in 2021

一碗白开水一 8079

C++邻接矩阵实现有向图、无向图

/*********************邻接矩阵实现无向图******************/ class MatrixUDG { private: char mVexs[MAX];//顶点集合 int mVexBum;//顶点数 int mEdgNum;//边数 int mMatrix[MAX][MAX];//邻接矩阵 char readChar();/

weixin_38044916的博客 4487

STM32(五) Modbus

1.freeemodbus中如何通过串口发送和接收数据 freemodbus通过串口中断的方式接收和发送数据。采用这种做法我想可以节省程序等待的时间,并且也短充分使用CPU的资源。串口中断接收毋庸置疑,在中断服务函数中把数据保存在数组中,以便稍后处理。但是串口发送中断使用哪种形式?串口发送中断至少有两种方式,第一种,数据寄存器空中断,只要数据寄存器为空并且中断屏蔽位置位,那么中断就会发生;第二种...

羞羞滴小朋友 5612

软考-数据库系统工程师2004-2019年真题与答案

考试必备:软考-数据库系统工程师2004-2019年真题与答案,软考-数据库系统工程师2004-2019年真题与答案,软考-数据库系统工程师2004-2019年真题与答案

Qualcomm工具的使用

简介   由于我们公司主要是以高通平台为主,所以工具的使用是必不可少的,包括QPST、QRCT3、QXDM、QDART等。   高通工具顾名思义就是,对于高通平台的软件开发进行软件的烧录,软件的调试,软件的Log的抓取和分析过程,像我们平常用的大致就是烧版本、改NV、制作QCN、然后校准、强发强收等操作。 QPST   QPST主要是用来做一些参数的配置,包括EFS文件的编辑,QCN的导入和备份与...

Jimmy 2万+

Linux自动巡检脚本

Linux自动巡检脚本 该脚本适用于日常巡检,可根据需求自行增减内容 脚本内容 [root@localhost ~]# cat xunjian-v1.sh #!/bin/bash ######################################################################################################## # @mail qujiayu98@163.com # @author qujiayu # @company_name

jiayu的博客 6432

qt实现程序密钥注册功能,MD5加密+AES加密,并实现一台电脑系统一个密钥

qt实现了一个给自己软件加密的功能。 原理是: 需要被注册的软件第一次运行的时候,在系统的注册表里面注册一个键值,如下: 这个值作为生成密钥的用户识别号,然后生成密钥文件key.db,把这个key.db文件放到软件执行目录下,即可完成软件的注册并正常使用软件。 软件第一次打开的界面及密钥生成工具软件界面如下: 将密钥生成工具软件生成的key.db放到软件执行目录下之后,软件即可正常使用,如下图: 代码使用了MD5加密 外加 AES加密, 解密和加密的核心代码如下: QSt.

weixin_43935474的博客 4129

图的存储—邻接矩阵和邻接表

本文涉及图的其中两种存储结构—邻接矩阵和邻接表,附代码。

2401_83624776的博客 5478

Cisco Packet Tracert 无线路由器配置

Cisco Packet Tracert 无线路由器配置

yushan_caoyu的博客 2万+

差分信号_差分信号的原理及其在PCB的设计

差分线是 PCB 设计中非常重要的一部分信号线,信号处理要求也是相当严谨,今天为大家介绍下差分信号的原理以及其在 PCB 设计中的处理方法。 什么是差分信号 差分传输是一种信号传输的技术,区别于传统的一根信号线一根地线的做法,差分传输在这两根线上都传输信号,这两个信号的振幅相等,相位相差 180 度,极性相反。在这两根线上传输的信号就是差分...

weixin_31849185的博客 1812

采用邻接矩阵法创建无向图和有向图

#include<stdio.h> #include<stack> #include <iostream> #define MAXSIZE 100 #define MaxInt 32767 //表示最大值,即正无穷大 #define MVNum 100 //定义最大顶点数 using namespace std; typedef char VerTexType;//假设顶点数据类型为字符型 typedef int ArcType;//假设边的权值为整型 type.

千言万语ROOM 9957

奇安信 2025 年护网蓝队初选笔试题(附答案解析)

熬夜为大家整理了 奇安信 2025 年护网蓝队初选笔试题,(关注我我会持续更新)涵盖 SQL 注入、Web 安全、渗透测试、二进制安全 等核心知识点,并附上详细答案解析,助力大家高效备考!12.下列关于虚表指针描述正确的是(1.5分)✅ B. 虚表指针存储的是虚表的首地址❌ A. 任何类对象都存在虚表指针(仅含虚函数的类有)❌ C. 虚表指针位于对象内存空间的起始处(由编译器决定)❌ D. 虚表指针是否存在不影响对象所占内存空间的大小(存在时会增加指针大小)📌 解析:虚表指针(vptr)用于实现多态,指向

Aishenyanying33的博客 4698

C++ 图(邻接矩阵和邻接表结构)

文章目录图的基本概念图的存储结构邻接矩阵邻接表图的广度优先遍历图的深度优先遍历代码实现最小生成树Kruskal算法Prime算法最短路径 图的基本概念 图的存储结构 因为图中既有节点,又有边(节点与节点之间的关系),因此,在图的存储中,只需要保存:节点和边关系即可。节点保存比较简单,只需要一段连续空间即可。 其边关系一般采用邻接矩阵或邻接表的方式保存。 邻接矩阵 因为节点与节点之间的关系就是连通与否,即为0或者1,因此邻接矩阵(二维数组)即是:先用一个数组将定点保存,然后采用矩阵来表示节点与

精致的灰的博客 5616

4 轴穿越机 Mark5 机架全解析:从历史演进到电机桨叶选型指南

本文围绕 4 轴穿越机 Mark5 机架展开,先介绍其发展历程(2018 年初代到 2023 年五代,迭代优化轻量化、刚性与兼容性),再明确其核心参数(轴距 220mm、兼容 4-6 寸桨等)对电机桨叶的约束。 详解电机(KV 值、尺寸、推力等)与桨叶(尺寸、螺距、材质等)选型要点及匹配原则(高 KV 配小桨、低 KV 配大桨),给出推重比、功率等理论计算公式,结合新手练习、花飞、竞速、航拍等场景提供具体选型案例,最后提及安全、成本、法规等注意事项,为爱好者提供全面选型参考。

bother3000的博客 1901

人工蜂群优化算法(ABC)详解:原理、实现与应用

人工蜂群算法(Artificial Bee Colony, ABC)是Karaboga于2005年提出的一种群体智能优化算法,其灵感来源于蜜蜂群体在自然界中高效的采蜜行为。该算法通过模拟雇佣蜂、观察蜂和侦察蜂三种角色的分工协作来寻找最优解。在ABC算法中,每个潜在的解决方案被视为一个“食物源”,其质量由适应度函数评估。雇佣蜂负责在已知优质食物源附近进行局部开采;观察蜂根据雇佣蜂分享的信息,以一定概率选择并跟进优质食物源;侦察蜂则随机探索新区域,防止种群陷入局部最优。

qq_42212808的博客 393

无向图的表示:邻接矩阵和邻接表

这里将一个无向图用邻接表和邻接矩阵表示。 输入:顶底个数n,图中的各个边(用两个顶点表示)。 输出:这个无线图的邻接矩阵和邻接表,其中邻接表中的链接按元素大小升序排列。 先给出一个例子说明。假设有无向图如下,则其邻接矩阵和邻接表如提示框中所示(其实就是下面程序的输出)。 下面是程序的代码: #include #include //图的表示,输入节点个数和边,构造图的邻接矩阵

x_i_y_u_e的专栏 2万+

【第13话:感知算法】库位与可行驶区域检测:自主泊车场景中的检测及语义分割方法

本文提出了一种自动泊车系统中的泊车库位线检测方法,通过逆透视映射(IPM)将车辆摄像头图像转换为鸟瞰视图,消除透视变形。该方法结合目标检测和语义分割模型,先定位库位线候选区域,再生成像素级精确掩码。后处理步骤将掩码转换为结构化输出,包括停车位边界多边形和可行驶区域掩码。整个流程采用深度学习模型和计算机视觉技术,可实现高精度的泊车环境感知,为自动泊车系统提供可靠支持。

一碗白开水一 1161

C/C++每日一练:图的邻接矩阵和邻接表表示

图是一种非线性数据结构,由和组成。可以将图抽象地表示为一组和一组的集合。以下示例展示了一个包含 5 个顶点和 7 条边的图。将顶点看作节点,边看作连接各个节点的引用(指针),就可以将图看作一种从链表拓展而来的数据结构。如图所示,相较于和的自由度更高,因而更为复杂。

weixin_60461563的博客 1049

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

邻接矩阵和邻接表的相互转化

#include <iostream> #define MaxNum 100 using namespace std; //邻接矩阵 typedef struct{ int Vex[MaxNum]; //顶点 int edge[MaxNum][MaxNum]; //边 int arcnum,vexnum; //边和顶点个数 }MGraph; //邻接表 typedef struct ArcNode{ int adjvex; struct ArcNode *next; .

KK_2018的技术博客_程序员不止是程序员 2584

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

C语言邻接矩阵和邻接表的相互转换算法讲解,邻接矩阵与邻接表的相互转换

编写一个程序,输出带权图的邻接矩阵,并能将该邻接矩阵转换成相应的邻接表,并输出该邻接表,带权图如下图所示。具体效果如下: 2.1.编写一个算法,实现由已知的邻接表产生对应的邻接矩阵,并输出。 具体效果如下:#include #include#define MAXV 100#define MaxSize 100#define INF 327676using namespace std;typede...

weixin_36361600的博客 2450

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

无向图的邻接矩阵c语言代码大全,【C语言设计教程】第3课.邻接矩阵无向图

邻接矩阵的定义:邻接矩阵(Adjacency Matrix):是表示顶点之间相邻关系的矩阵。设G=(V,E)是一个图,其中V={v1,v2,…,vn}。G的邻接矩阵是一个具有下列性质的n阶方阵:①对无向图而言,邻接矩阵一定是对称的,而且对角线一定为零(在此仅讨论无向简单图),有向图则不一定如此。②在无向图中,任一顶点i的度为第i列所有元素的和,在有向图中顶点i的出度为第i行所有元素的和,而入度为第...

weixin_35945480的博客 2184

【高阶数据结构】第三弹---图的存储与遍历详解:邻接表构建与邻接矩阵的BFS/DFS实现

图的存储结构:邻接表【边的结构,图的基本结构,图的创建,获取顶点下标,添加边,打印,测试一,测试二】;图的遍历:图的广度优先遍历,图的深度优先遍历~~~

小林熬夜学习编程的博客 2575

图论基础与C++实现:从概念到邻接矩阵与邻接表

较少时,矩阵中存储了大量的0成为系数矩阵,比较浪费空间,并且要求两个节点之间的路径不是很好求。2. 如果边带有权值,并且两个节点之间是连通的,上图中的边的关系就用权值代替,如果两个。是该顶点的出度,也称出度表,要得到vi顶点的入度,必须检测其他所有顶点对应的边链。,图中的第k条边记作ek,ek = (vi,vj)或<vi,vj>。中,若从顶点v1到顶点v2有路径,则称顶点v1与顶点v2是连通的。因为图中既有节点,又有边(节点与节点之间的关系),因此,:在图G = (V, E)中,若。

2509_94101176的博客 604

c语言邻接表的构建_邻接表无向图(一)之 C语言详解

本章介绍邻接表无向图。在"图的理论基础"中已经对图进行了理论介绍,这里就不再对图的概念进行重复说明了。和以往一样,本文会先给出C语言的实现;后续再分别给出C++和Java版本的实现。实现的语言虽不同,但是原理如出一辙,选择其中之一进行了解即可。若文章有错误或不足的地方,请不吝指出!目录1. 邻接表无向图的介绍2. 邻接表无向图的代码说明3. 邻接表无向图的完整源码转载请注明出处:http://ww...

weixin_34911236的博客 1865

邻接矩阵用c语言,邻接矩阵无向图(一)之 C语言详解

本章介绍邻接矩阵无向图。在"图的理论基础"中已经对图进行了理论介绍,这里就不再对图的概念进行重复说明了。和以往一样,本文会先给出C语言的实现;后续再分别给出C++和Java版本的实现。实现的语言虽不同,但是原理如出一辙,选择其中之一进行了解即可。若文章有错误或不足的地方,请不吝指出!邻接矩阵无向图的介绍邻接矩阵无向图是指通过邻接矩阵表示的无向图。上面的图G1包含了"A,B,C,D,E,F,G"共7...

weixin_39781550的博客 1429
上一篇: AVL树插入删除算法详解(有图) -- C++语言实现
下一篇: 图的深度优先搜索和广度优先搜索算法、最小生成树两种算法 --C++实现
FreeeLinux
博客等级 码龄11年 421粉丝 356原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值