(蒟蒻的第三篇文章,希望dalao勿喷)
(希望没问题)
声明:
1.本人变量定义的名称很low
2.本人用的方法也很low
3.但我觉得文章应该不low (盲目自信)
第三篇文章讲讲图的那些事儿
图的定义和概念
图,其实就是在一张纸上(或一个空间内)点上几个点,在将它们用线连接起来,组成的一个图形,就差不多是图,举两个例子:
并且,图也有一些专有名词:
1.有向图:被连通的任意两点只能按规定从一个点到达另一个点,但不能回来
2.无向图:被连通的任意两点可以从一个点到达另一个点,也可以从另一个点到达这一个点
3.结点的度:与指定点连通的边的个数
4.结点的入度:在有向图中,可以到达指定点的边的个数
5.结点的出度:在有向图中,可以从指定点出发到另一个点的边的个数
6.权值:指定边的长度(通常题目中会给
7.连通:(应该放在上面的)两个指定点有边相连(一个或多个
8.回路:指定点可以成为这个图的起点和终点(可以理解成一个环
(这里只介绍常用好理解的,其余的可以参考其它资料
图的存储
讲完了基础概念,再讲一讲图如何存储
邻接矩阵存储法
邻接矩阵存储法是较为方便,简单的一种存储图的方法
思路
这种存储方法是先定义一个book二维数组,初始化全为∞,假设输入a b结点连通(无向图)且权值为c,则将对应的book[a][b]和book[b][a]都赋值成c
代码
主要代码展示无向图,注释展示有向图存储
#include <bits/stdc++.h>
using namespace std;
int inf=2147483647;
int n;
int book[15][15];
int main()
{
for(int i=0;i<=14;i++)
for(int j=0;j<=14;j++)
book[i][j]=inf; //book初始化
cin>>n; //要输入n条边的信息
for(int i=1;i<=n;i++)
{
int a,b,c; //a b 为结点 c 为权值
cin>>a>>b>>c;
book[a][b]=c; //如果只能从a→b 就只写这一行
book[b][a]=c; //如果只能从b→a 就只写这一行
}
//测试一下
for(int i=0;i<=14;i++)
{
for(int j=0;j<=14;j++)
printf("%10d ",book[i][j]); //为了方便查看
cout<<endl;
}
return 0;
}
输入样例
10
2 3 5
1 5 5
3 5 6
1 2 8
1 3 8
5 3 4
4 1 8
4 5 3
3 5 -1
5 4 2
(数据很水
运行结果
另外,邻接矩阵存储法还可以用vector来存