算法训练_图论基础知识
常用知识点
在无向图或者有向图中,顶点的度数总和为边数的两倍。
路径: 从顶点出发,经过一些顶点到达终点,顶点序列(顶点,…,终点)
路径长度: 路径中边的数量。
简单路径: 在路径中的顶点均不重复。
回路: 路径的顶点和终点是同一个点。
连通图: 无向图中,任意一对顶点间都是连通(顶点u到顶点v之间有路径)的。
有根树: 无向连通图中不存在回路,这时在图中指定图的一个顶点为树的根。
度序列
将图G中的顶点读书排成一个序列s,则称s为图G的度序列。
一个序列是可图的,是指这个序列是某个无向图的度序列。
eg: 4 3 2 2 1(可图)
2 1 1 0
0 0 0
若出现了负数,则直接认为该序列是不可图的。
邻接矩阵
每个顶点用一个一维数组储存边的信息,矩阵的大小为顶点的个数N,
在G1中顶点1的出度为第一行之和,为3
在G1中顶点3的入度为第一行之和,为2
邻接表
邻接表的优点:可以节省空间,可以重复记录边。
稀疏图: 顶点多,边很少
稠密图:顶点少,边很多
邻接表的实现:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> G[11];
int m;
cin >> m;
for(int i = 0 ; i < m ; i++)
{
int a,b;
cin >> a >> b;
G[a].push_back(b); //无向图的实现
G[b].push_back(a);
}
return 0;
}
带权值的图
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
struct node{
int v , w; //v是用来记录连接的点,w是记录权重
};
vector<node> G[11];
//带权的有向图实现
void insert1(int u , int v , int w)
{
node temp; //用temp变量暂时保存v,w的值
temp.v = v;
temp.w = w;
G[u].push_back(temp); //向 u的邻接表插入temp这条边,边的点为v权值为w
}
//带权的无向图的实现
void insert2(int u , int v ,int w)
{
insert1(u , v , w);
insert1(v , u , w);
}
int main()
{
int m;
cin >> m;
for(int i= 0 ; i < m ; i++)
{
int u , v , w;
cin >> u >> v >> w;
insert2(u , v ,w);
}
for(int i = 1 ; i <= 10 ; i++)
{
for(int j = 0; j < G[i].size() ; j++)
{
cout << "(" << i << "," << G[i][j].v <<"," <<G[i][j].w << ")" <<endl;
}
}
return 0;
}
来源:CSDN
作者:源0.0
链接:https://blog.csdn.net/qq_45244489/article/details/103749568