什么是图:
在一个社交网络中,每个帐号和他们之间的关系构成了一张巨大的网络,就像下面这张图片:
那么在计算机里我们该怎样存储这个网络呢?这时,我们就要用到一种数据结构,叫做图。
图的分类:
1:有向图
在有向图中,边连接的两个顶点之间是有序的。箭头的方向就表示有向边的方向。
2:无向图
在无向图中,边连接的两个顶点是无序的,这些边被称为无向边。
邻接矩阵:
什么是邻接矩阵呢?所谓邻接矩阵存储结构就每个顶点用一个一维数组存储边的信息,这样所有点合起来就是用矩阵表示图中各顶点之间的邻接关系。所谓矩阵其实就是二维数组。下图为有向图 G1 和无向图 G2 对应的邻接矩阵:
带权值的图:
在前面的讲解中,图中的边都只是用来表示两个点之间是否存在关系,而没有体现出两个点之间关系的强弱。比如在
社交网络中,不能单纯地用 、 来表示两个人否为朋友。当两个人是朋友时,有可能是很好的朋友,也有可能是一
般的朋友,还有可能是不熟悉的朋友。
我们用一个数值来表示两个人之间的朋友关系强弱,两个人的朋友关系越强,对应的值就越大。而这个值就是两个人
在图中对应的边的权值,简称 边权。对应的图我们称之为 带权图。
如下就是一个带权图,我们把每条边对应的边权标记在边上:
度的概念:
在无向图中,顶点的度是指某个顶点连出的边数。例如在下图中,顶点b的度数为3,顶点a的度数为4:
在有向图中,和度对应的是 入度 和 出度 这两个概念。顶点的入度是指以该顶点为终点的有向边数量,顶点的出度是
指以顶点为起点的有向边数量。需要注意的是,在有向图里,顶点是没有 度 的概念的。例如在下图中,a顶点 的入
度为 1,出度为 3,顶点 c的入度为2 ,出度为 2:
好了,图的概念基本上已经讲完了,下面附赠一些习题帮助消化:
无向图的度数统计:
输入两个值n和m,分别表示顶点数(编号为1到n)和边数,挨个输出每个顶点的度数。
input:
4 5
1 2
1 3
2 4
1 4
3 4
output:
3 2 2 3
有向图的度数统计:
输入两个值n和m,分别表示顶点数(编号为1到n)和边数,挨个输出每个顶点的入度和出度。//是有向图!!
input:
4 5
1 2
1 3
2 4
1 4
3 4
output:
3 0
1 1
1 1
0 3
邻接矩阵的使用:
输入两个值n和m,分别表示顶点数(编号为1到n)和边数,输出这个无向图的邻接矩阵。
input:
4 5
1 2
1 3
2 4
1 4
3 4
output:
0 1 1 1
1 0 0 1
1 0 0 1
1 1 1 0
判断完全图:
给你一个图的邻接矩阵,现在要你判断这个图是否是完全图。
如果是输出“Yes”,否则就输出“No”。
保证输入的图不存在自环。
input:
3
0 0 0
0 0 0
0 0 0
output:
No
做完了吗?下面是题解:
1:
#include <iostream>
using namespace std;
int deg[105];
int main() {
int n, m;
cin >> n >> m;
for(int i = 0; i < m; i++) {
int u, v;
cin >> u >> v;
deg[u]++;
deg[v]++;
}
for(int i = 1; i <= n; i++){
cout << deg[i] << " ";
}
return 0;
}
2:
#include <iostream>
using namespace std;
int outdeg[105], indeg[105];
int main() {
int n, m;
cin >> n >> m;
for (int i = 0; i < m; i++) {
int u, v;
cin >> u >> v;
outdeg[u]++;
indeg[v]++;
}
for (int i = 1; i <= n; i++) {
cout << outdeg[i] << " " << indeg[i] << endl;
}
return 0;
}
3:
#include <iostream>
using namespace std;
const int maxn = 105;
int G[maxn][maxn];
int main() {
int n, m;
cin >> n >> m;
for (int i = 0; i < m; i++) {
int u, v;
cin >> u >> v;
G[u][v] = G[v][u] = 1;
}
for(int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cout << G[i][j] << " ";
}
cout << endl;
}
return 0;
}
4:
#include <cstdio>
#include <iostream>
using namespace std;
const int maxn = 1005;
int G[maxn][maxn];
int main () {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cin >> G[i][j];
}
}
bool flag = true;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (i != j && G[i][j] == 0) {
flag = false;
}
}
}
if (flag == true) {
cout << "Yes" << endl;
} else {
cout << "No" << endl;
}
return 0;
}
你既然认真看了,为何不点个赞呢?