【数据结构】图的初认识

基本概念

什么是图?

图是一种数据结构,它的概念很容易理解:点用边连接起来就是图

关于图的定义与概念

有向图

图上的边有方向,只能从一点到另一点。如下图,只能由点C直接到点A,而不能从点A到点C

有向图示例

相关概念

结点的入度:在有向图中,以此结点为终点的边的数量
结点的出度:在有向图中,以此结点为起点的边的数量

无向图

图上的边没有方向,可以双向到达

相关概念

结点的度:在无向图中,与此结点相连的边的数量

通用概念

权值:边的“代价”/“费用”,可以理解为路费或油耗
连通:如果图中两个结点之间有一条从其中一点通过若干条边、点到达另一个点的通路,则称这两个点连通
回路:起点与终点为同一个点的路径,称作回路或“环”
完全图:每个点之间都能直接到达的图

注:一个拥有n个结点的完全无向图有 n * (n-1)/2 条边,一个拥有n个结点的完全有向图则有 n * (n-1)条边
稠密图:一个边数接近完全图的图
稀疏图:一个边数远远少于完全图的图

强联通分量:在有向图中,任意两点都连通的最大子图,单个点也算强联通分量!

图的存储

邻接矩阵存储

定义:有权图中,G[i][j]表示从点i到点j的边的权值,如果无边即为∞;无权图即表示为1和0
如图:
邻接矩阵示例
转换为图就是:
图示例

代码实现:

#include<bits/stdc++.h>
using namespace std;
int matrix[1024][1024],n;
int main()
{
	int i,j;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
		for(j=1;j<=n;j++)
			scanf("%d",&matrix[i][j]);
	return 0;
}

邻接表存储

图的一种链式存储方法,一般用数组模拟,而不是直接用链表

代码实现:
#include<bits/stdc++.h>
using namespace std;
int head[1024],nxt[2048],to[2048],tot=0;//无向图需要存边的数组开两倍的内存
void add_edge(int u,int v)
{
	nxt[++tot]=head[u];
	to[tot]=v;
	head[u]=tot;	
}  
int main()
{
	int n,m,i,u,v;
	scanf("%d %d",&n,&m); 
	for(i=0;i<m;i++)
	{
		scanf("%d %d",&u,&v);
		add_edge(u,v);
		add_edge(v,u);//无向图双向建边
	}
	return 0;
}

注:部分图片来源于网络,如侵权可评论/私信提醒

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

EXGZCWASTAKEN

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值