1,邻接矩阵
逻辑结构分为两部分:V和E集合,其中,V是顶点,E是边。因此,用一个一维数组存放图中所有顶点数据;用一个二维数组存放顶点间关系(边或弧)的数据,这个二维数组称为邻接矩阵。邻接矩阵又分为有向图邻接矩阵和无向图邻接矩阵
创建一个二维数组v[5]\[5],将点作为下标,数组值代表这条边的权值,a=1,b=2,c=3,d=4,由图可知v[1]\[2]=3
2,数组存边
```c++
struct Edge
{
int value;//边的权
int to;//边的终点
int from;//边的起点
} edge[500005];
//存边
for (int i = 0; i < m; i++)
{
cin >> u >> v >> w;
edge[i].from = u;
edge[i].to = v;
edge[i].value = w;
}
```
3,邻接表
邻接表是表示了图中与每一个顶点相邻的边集的集合,这里的集合指的是无序集。
如果是无向图,那么每条边由两个结点组成,分别代表边的两个端点;如果是有向图,那么每条边是一个结点对,分别代表边的始点和终点。
```c++
vector<int> a[500005];
//存边
for(int i=0;i<m;i++){
cin >> u >>v;//u点与v点是连通的
a[u].push_back(v);
//a[i]存的为与i点相连的点,但一般不存边权
}
//遍历
for(int i=1;i<=n;i++)//遍历起点
{
for(int j=0;j<a[i].size();j++)//遍历和i相连的点
{
cout << "起点:"<< i<<" 终点:"<< a[i][j] <<'\n';
}
}
```
4,链式前向星
一种数据结构,以储存边的方式来存储图。构造方法如下:读入每条边的信息,将边存放在数组中,把数组中的边按照起点顺序排序(可以使用基数排序,如下面例程),前向星就构造完了。通常用在点的数目太多,或两点之间有多条弧的时候。一般在别的数据结构不能使用的时候才考虑用前向星。除了不能直接用起点终点定位以外,前向星几乎是完美的。
```c++
struct Edge
{
int next;//下个同起点的边的在edge数组里的下标
int value;//当前边的边权
int to;//这条边的终点
} edge[500005];
int first_edge[500005];//first_edge[i]存的是以i为起点的第一个边在edge数组里的下标
//存边
void add(int u, int v, int val, int i)
{
edge[i].to = v;//记录这条边的终点
edge[i].value = val;//边权
edge[i].next = first_edge[u];//下条同起点的边的下标为原先的第一条边的下标
first_edge[u] = i;//新的第一条边更新
}
//遍历
for(int j=1;j<=n;j++)//遍历所有起点[1,n]
{
for (int i = first_edge[j]; i != 0; i = edge[i].next)//遍历起点为j的所有边
{
cout << " 起点:"<<j<<" 终点:"<<edge[i].to<< " 边权:"<<edge[i].value<< '\n';
}
}
```
题目: