<一>图的基本概念
(1);图由顶点(vertex), 边(edge)组成,记号G(V,E)表示图G的顶点集为V,边集为E。
V={v1,v2,…… } 是有限非空集合,为顶点集,其元素称为顶点或结点
E={e1,e2,…… } 是有限集合,称为边集
(2);无向图 边没有方向
1. 顶点集和边集分别为:(举例表示)
V(G2)={v1,v2,v3,v4}
E(G2)={(vl,v2),(v1,v3),(v1,v4),(v2,v3),(v2,v4),(v3,v4)}
有向图 每条边都有方向,由始点指向终点
1.顶点集和边集分别为:
V(G1)={v1,v2,v3}
E(G1)={<v1,v2>,<v2,v1>,<v2,v3>}
2. 度 指与该顶点想连的边数
入度;顶点的入边条数
出度;顶点的出边条数
(3);顶点与边数的关系
1若G是无向图,则0≤e≤n(n-1)/2
恰有n(n-1)/2条边的无向图称无向完全图(Undireet-ed Complete Graph)
2若G是有向图,则0≤e≤n(n-1)。
恰有n(n-1)条边的有向图称为有向完全图(Directed Complete Graph)。
(4)联通块
1联通分量(无向图)
连通;两个顶点相连,或者可通过一定路径到达。
连通图;任意两个顶点,都是连通的
否则为非连通图,称其中极大连通子图为连通分量
2.强连通分量.(有向图)
强连通;两个顶点可以各自通过一定有向路径到达另外一个顶点
强连通图;任意两个顶点,都是强连通的
否则为非强连通图,称其中极大强连通子图为强连通分量
<二>.图的存储
(1).邻接矩阵
设图G(V,E) 的顶点标号为0,1,2,…,N-1,令二维数组G[N][N]表示图的顶点标号,可令如果G[i][j]=1则表示i与j有边,G[i][j]=0则i与j无边
(无向图为对称式的结构)
另外可以添加二维数组的值来表示权值
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <queue>
#include <vector>
#include <cmath>
#include <set>
#include <deque>
#include <map>
#include <string>
using namespace std;
/*******************
输入格式;
边数(a,b) 权值c
1,2 C1
2,3 C2
…… …
*******************/
const int maxn=10000; //定义输入数据的最大值
int juzhen[maxn][maxn];
int main(){
// freopen("C:\\Users\\24398\\Desktop\\in-project.txt","r",stdin);
int n;
cin>>n; //输入边数
int a,b,c //定义结点,权值
//初始化二维数组
memset(juzhen,0,sizeof(juzhen));
for(int i=0;i<n;++i){
cin>>a>>b>>c;
juzhen[a][b]=c;
}
/* 后续操作
遍历
output();
*/
return 0;
}
有向图也可类似方法表示
(2).邻接表
图中每个顶点建立一个单链表,第i个单链表中的结点表示依附于顶点Vi的边(对有向图是以顶点Vi为尾的弧)
//邻接表
vector<int> Adj[N]; //开vector数组,存储结点i的边
Adj[i].push_back[j]; //添加一条从1号顶点到3号顶点的边
//边权 声明结构体存储
struct Node{
int v; //边的终点编号
int w; //边权
};
vector<Node> Adj[N]; //声明Node型
//添加
Node temp //临时变量
temp.v=x;
temp.u=y;
Adj[i].push_back[temp];