首页 > 其他分享 >存图方式

存图方式

时间:2024-07-09 20:08:50浏览次数:5  
标签:方式 int tot 存图 vec include addedge 105

存图方式

在进行图上的一些操作时,存图,是必要的前置操作。

e.g.

接下来的 Code 以这为测试:

# input
4 5
1 2
1 3
2 4
1 4
3 4

朴素做法

邻接矩阵,便是一种简单的结构,使用 bool 类型为底,如果 \(u \to v\) 有边,\(a_{u,v} = 1\),否则 \(a_{u,v} = 0\)。

Code1

#include <iostream>
using namespace std;
bool a[105][105];
void addedge(int u,int v)
{
	a[u][v]=true;
	return ;
}
int main()
{
	int n,m;
	cin>>n>>m;
	for(int i=0;i<m;i++)
	{
		int u,v;
		cin>>u>>v;
		addedge(u,v);
		addedge(v,u);
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++) cout<<a[i][j]<<" ";
		cout<<endl;
	}
	return 0;
}
# output
0 1 1 1
1 0 0 1
1 0 0 1
1 1 1 0

升级做法

可想而知,这样的空间复杂度是非常高昂的,因此,我们使用 vector 来优化,如果 \(u \to v\) 有边,则有 \(vec_{u,i} = v\),否则没有 \(vec_{u,i} = v\)。

Code2

#include <iostream>
#include <vector>
using namespace std;
vector<int> vec[105]; 
void addedge(int u,int v)
{
	vec[u].push_back(v);
	return ;
}
int main()
{
	int n,m;
	cin>>n>>m;
	for(int i=0;i<m;i++)
	{
		int u,v;
		cin>>u>>v;
		addedge(u,v);
		addedge(v,u);
	}
	for(int i=1;i<=n;i++)
	{
		cout<<i<<": ";
		for(int j=0;j<vec[i].size();j++) cout<<vec[i][j]<<" ";
		cout<<endl;
	}
	return 0;
}
# output
1: 2 3 4
2: 1 4
3: 1 4
4: 2 1 3

再升级做法

即一种基于数组模拟链表的策略。

  • \(h\) 数组是 head 表示第一项;
  • \(to\) 是可以到达的点;
  • \(nxt\) 是这一项下一项的地址。

Code3

#include <iostream>
using namespace std;
int h[105],tot;
struct CFS
{
	int to;
	int nxt;
	CFS(){};
	CFS(int t,int n){
		nxt=n;
		to=t;
	};
}edge[10005];
void addedge(int u,int v)
{
	tot++;
	edge[tot]=CFS(v,h[u]);
	h[u]=tot;
	return ;
}
int main()
{
	int n,m;
	cin>>n>>m;
	for(int i=0;i<m;i++)
	{
		int u,v;
		cin>>u>>v;
		addedge(u,v);
		addedge(v,u);
	}
	for(int i=1;i<=n;i++)
	{
		cout<<i<<": ";
		for(int j=h[i];j;j=edge[j].nxt) cout<<edge[j].to<<" ";
		cout<<endl;
	}
	return 0;
}
# output
1: 4 3 2
2: 4 1
3: 4 1
4: 3 1 2

标签:方式,int,tot,存图,vec,include,addedge,105
From: https://www.cnblogs.com/zhangyuyi1218/p/-/input_graph

相关文章

  • python最简单的方式连接数据库做查询和插入操作
    用最简单的代码连接数据库并操作数据库1、包安装pipinstallpymysqlpipinstallcryptography2、源码样例importpymysqlimportuuididNum='123456'try:#连接数据库connection=pymysql.connect(host='192.168.0.11',user='xxxuser',password......
  • 各种软件启动方式
    各种软件启动方式1.MySQL#启动servicemysqldstart#关闭servicemysqldstop#重启servicemysqldrestart2.Redis#启动serviceredisdstart#关闭serviceredisdstop3.nginx#启动./nginx#关闭./nginx-squit#快速关闭./nginx-sstop#重新加载......
  • OAuth2.0登录的四种方式
    OAuth登录的四种方式1.授权码授权码(authorizationcode)方式,指的是第三方应用先申请一个授权码,然后再用该码获取令牌。这种方式是最常用的流程,安全性也最高,它适用于那些有后端的Web应用。授权码通过前端传送,令牌则是储存在后端,而且所有与资源服务器的通信都在后端完成。这样......
  • 敏捷的两种方式:Kanban和 Scrum
    敏捷方法通过提供灵活、迭代的项目管理方法,改变了软件开发。敏捷方法中最著名的框架是 Kanban和Scrum。虽然这两种方法都旨在提高生产力和效率,但它们的运作原则和实践却截然不同。在本文中,我们将深入探讨Kanban和Scrum的起源、主要特点、原则、区别和相似之处。什么是Kan......
  • js浅拷贝与深拷贝的区别和实现方式
           ......
  • 申请SSL证书怎么进行域名验证?域名验证的三种方式
    SSL证书是用于加密和保护Web服务器和浏览器之间通信的数字证书,在申请SSL证书时,为了防止域名被冒用,对于申请SSL证书的域名,要求先验证这个域名的所有权。而目前可用的域名验证SSL证书方式有三种:分别是DNS验证、邮箱验证、文件验证。本文将详细介绍这三种SSL证书域名验证方式,一起......
  • 【免费】可视化工具如何重塑教育资源的呈现方式
    传统教育模式下,教育资源的分配、学生的学习进度、教师的教学质量等关键信息往往隐藏在海量的数据之中,难以被直观理解和有效利用。可视化技术为这些数据插上了翅膀,让它们以图表、图像、动画等形式跃然屏上,一目了然。  山海鲸可视化将教育资源数据可视化,使得学校管理者可以清......
  • 【饼图交通方式】用ECharts的graphic配置打造个性化
    利用ECharts的graphic配置打造个性化图表内容概要ECharts是一款强大的数据可视化工具,它提供了丰富的配置选项来定制图表。本文将重点介绍graphic配置的使用,展示如何通过在饼图中添加个性化的图形元素,例如中心图像,来增强图表的视觉效果。效果预览适用人群数据可视化工......
  • 算法题里存储数据的方式(C++)
    这里分享的不是如邻接矩阵邻接表的算法存储,仅仅是一些特殊数据的简易存储,以方便操作1、map<int,vector<int>>mp当给出很多串数字,每一串数字都需要单数放一个一维数组里,但是开辟一个二维数组内存又过大,并且不好操作时,可以用map<int,vector<int>>mp来存储,这样就可以单独操......
  • vue3 watch使用方式,如何监听reactive子属性 ref数据等
    代码<template><divclass="box">childB</div></template><scriptlang="ts"setup>import{reactive,watch,ref}from"vue";constdata1=reactive({msg:"childB",abc:"sl......