寒假训练 第十一节 搜索与图论 总结

图是由一个非空的顶点集合和一个描述顶点之间关系即边(Edges)的有限集合组成的一种数据结构。

(1)无向图:在一个图中,如果每条边都没有方向(如图7-1 (a)所示),则称该图为无向图。
(2)有向图:在一个图中,如果每条边都有方向(如图7-1 (b)所示),则称该图为有向图。
(3)无向完全图:在一个无向图中,如果任意两顶点都有一条直接边相连接,则称该图为无向完全图。如图7-2(a)所示,可以证明,在一个含有n个顶点的无向完全图中,有n(n-1)2条边。
(4)有向完全图:在一个有向图中,如果任意两顶点之间都有方向互为相反的两条弧相连接,则称该图为有向完全图,如图7-2 (b)所示。在一个含有n个顶点的有向完全图中,有n(n-1)条弧。
寒假训练 第十一节 搜索与图论 总结_第1张图片

图的邻接矩阵

邻接矩阵(Adjacency Matrix)是表示顶点之间相邻关系的矩阵。假设图G=(V,E)是具有n个顶点的图,即V={Vo,V1,…,V-l},则G的邻接矩阵是具有如下性质的n阶方阵:

寒假训练 第十一节 搜索与图论 总结_第2张图片
例子:
寒假训练 第十一节 搜索与图论 总结_第3张图片
对于ij表示abcd,如果两两间相连对应的ij就为1,不行了对于的ij就为0.

特点:
(1)无向图的邻接矩阵是对称的,而有向图的邻接矩阵不一定对称。
(2)对于无向图,顶点v的度是邻接矩阵中第i行(或第i列)的非零元素的个数。
(3)对于有向图,顶点v的度是邻接矩阵中第i行和第i列的非零元素的个数之和。
(4)用邻接矩阵方法存储图,很容易确定图中任意两个顶点之间是否有边相连,但要确定图中的边数,则必须按行、按列对每个元素进行检查,所花费的时间代价很大。这是邻接矩阵存储图的局限性。

P3916 图的遍历

寒假训练 第十一节 搜索与图论 总结_第4张图片

#include
#define MAX 100000
using namespace std;
int n,m,l;
int arr[MAX],arr2[MAX];

struct node{
	int v,w;
}a[MAX];

 void add(int x,int y){
	a[++l].v=y;
	a[l].w=arr[x];
	arr[x]=l;
}

 void aaa(int u,int v){
	if(arr2[v])
		return;
	arr2[v]=u;
	for(int i=arr[v];i;i=a[i].w){
		int v1=a[i].v;
		aaa(u,v1);
	}
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int a,b;
		cin>>a>>b;
		add(b,a);
	}
	for(int i=n;i>=1;i--)
		aaa(i,i);
	for(int i=1;i<=n;i++)
		cout<<arr2[i]<<" ";
	return 0;
}

你可能感兴趣的:(算法,图论,数据结构)