《洛谷深入浅出基础篇》 图的基本应用

什么是图?

我们在生活中学习中能看见很多图,地图,路线图,思维导图等等,它们都有一个特点,

你从中任找一个点,你可以找到,从这个点出发,能够到达什么地方,也许不能到达任何地方。

以这个点为终点,有哪些点能到达这个点。

利用图,我们可以有方向地去到每一个点。也能找到去到这个点最短的方法。

图的建立:

下面建立一个简单的图,来描述一些图的基本术语

无向图:

在这副地图之中,每个建筑物被称作:顶点

每对建筑物之间连接的小路叫做:边

走这条边需要花费的时间叫做:边权

 像这样的,一条路可以让两座建筑的人互相通行,不具有方向性的图,叫做无向图。

在无向图中,每个顶点所连接的边数,叫做每个顶点的度数。

有向图:

像这样的,一条路只允许一种方向的人通过,如果要两座建筑物之间互相往来,那么需要再建立一条单向路。这样的图叫做有向图。 

如果两个顶点之间有不止一条边直接连接,就称为重边。

如果一条边的起点和终点是相同的,就称为自环。

图的存储

方法一:邻接矩阵(无重边)

也就是建立一个二维矩阵 v[i][j] 代表,以i为起点,j为终点,的边权,如果v[i][j]=0说明i到j没有直接的路相连。

缺点就是,将图存入的时候,用到二重循环,假设有n个顶点,我们需要o(n^2)的空间复杂度,,遍历的时候,也是o(n^2)的时间复杂度。

方法二:邻接表

邻接矩阵和邻接表的区别就是,邻接表只存放具有边的顶点。减少了不必要的存放次数。

下面是邻接表的实现:

1,建立一个结构体,里面有两个变量,to,cost

分别代表,终点,边权。

2.建立一个二维vector   ,    vector<int> p [maxn]

每当读入一条边的<起点u,终点v,边权l> 用  p[u] .push_back((edge){ v,l}) 

using namespace std;
const int MAXN = 1005;
struct place {
	int to, cost;
};
vector <place > p[MAXN];
int v[MAXN][MAXN];
int main()
{
	int n,m;
	cin >> n>>m;
	
	while (m--)
	{
		int u, v, l;
		cin >> u >> v >> l;
		p[u].push_back({ v, l });
	}
	for (int i = 1; i <= n; i++) {
		for (int j = 0; j < p[i].size(); j++) {
			v[i][p[i][j].to] = p[i][j].cost;
		}
	}
	for(int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= n; j++)
			cout << v[i][j] << ' ';
		cout << endl;
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

louisdlee.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值