图
图是由一个非空的顶点集合和一个描述顶点之间关系即边(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)条弧。
图的邻接矩阵
邻接矩阵(Adjacency Matrix)是表示顶点之间相邻关系的矩阵。假设图G=(V,E)是具有n个顶点的图,即V={Vo,V1,…,V-l},则G的邻接矩阵是具有如下性质的n阶方阵:
例子:
对于ij表示abcd,如果两两间相连对应的ij就为1,不行了对于的ij就为0.
特点:
(1)无向图的邻接矩阵是对称的,而有向图的邻接矩阵不一定对称。
(2)对于无向图,顶点v的度是邻接矩阵中第i行(或第i列)的非零元素的个数。
(3)对于有向图,顶点v的度是邻接矩阵中第i行和第i列的非零元素的个数之和。
(4)用邻接矩阵方法存储图,很容易确定图中任意两个顶点之间是否有边相连,但要确定图中的边数,则必须按行、按列对每个元素进行检查,所花费的时间代价很大。这是邻接矩阵存储图的局限性。
#include<iostream>
#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;
}