邻接矩阵
设图G(V, E)的顶点标号为0, 1,…, N-1,那么可以令二维数组G[N][N]的两维分别表示图的顶点标号,即如果G[i][j]为1,则说明顶点 i 和顶点 j 之间有边;如果G[i][j]为0,则说明顶点 i 和顶点 j 之间不存在边,而这个二维数组G[][]则被称为邻接矩阵。
如果存在边权,则可以令G[i][j]存放边权,对不存在的边可以设边权为0、-1或是一个很大的数。
邻接表
设图G(V, E)的顶点标号为0, 1,…, N-1,每个顶点都可能有若干条出边,如果把同一个顶点的所有出边放在一个列表中,那么N个顶点就会有N个列表(没有出边,则对应空表)。这个N个列表被称为图G的邻接表,记为Adj[N],其中Adj[i]存放顶点i的所有出边组成的列表,这样Adj[0], Adj[1],…,Adj[N-1]就分别都是一个列表。
由于列表可以用链表实现,则其中Adj[0]用链表连接了两个结点,每个结点存放一条边的信息(括号外的数字是边的终点编号,括号内的数字是边权),于是0号顶点有两条出边:一条的终点为1号顶点(边权为2);另一条边的终点为4号顶点(边权为1)。而对Adj[4],表示4号顶点的三条出边信息,其终点分别是0号顶点、1号顶点、3号顶点,边权分别为1、2、1。
用vector来实现邻接表
邻接表只存放每条边的终点编号。
vector<int> Adj[N]; //N表示顶点个数
添加一条从1号顶点到达3号顶点的有向边,在Adj[1]中添加终点编号3(如果是无向边,就再添加一条从3号顶点到达1号顶点的有向边)。
Adj[1].push_back(3);
存放边的终点编号和边权
struct Node
{
int v; //边的终点编号
int w; //边权
};
vector邻接表中的元素类型就是Node型
vector<Node> Adj[N];
添加从1号到达3号顶点的有向边,边权为4,就可以定义一个Node型的临时变量temp,令temp.v=3、temp.w=4,然后把temp加入到Adj[1]中即可
Node temp;
temp.v = 3;
temp.w = 4;
Adj[1].push_back(temp);
定义结构体Node的构造函数
stuct Node
{
int v, w;
Node(int _v, int _w):v(_v),w(_w){} //构造函数
};
这样就不能定义临时变量来实现加边操作
Adj[1].push_back(Node(3, 4));