图论基础

流过昼夜 提交于 2020-01-14 07:56:28

算法训练_图论基础知识

常用知识点

在无向图或者有向图中,顶点的度数总和为边数的两倍。
路径: 从顶点出发,经过一些顶点到达终点,顶点序列(顶点,…,终点)
路径长度: 路径中边的数量。
简单路径: 在路径中的顶点均不重复。
回路: 路径的顶点和终点是同一个点。
连通图: 无向图中,任意一对顶点间都是连通(顶点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;
} 
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!