一、邻接矩阵
适合稠密图O(V^2)
g[row][col]
对于权值:
(1)有权图:INF表示不存在边、值表示权值
(2)无权图:0表示不存在边,1表示存在边
对于有向图、无向图:
(1)有向图:存一遍
(2)无向图:存两遍g[i][j] = g[j][i]
int g[N][N];
void createGraph1()
{
for(int i = 0;i < n;i ++)
{
int r,c,w;
cin >> r >> c >> w;
g[r][c] = w;
}
}
二、邻接表
给每个顶点都创建一个单链表
用vector实现:
(1)建结构体(起点、终点、权值)
(2)用vector[]存结构体
struct edge{
int from; //起点
int to; //终点
int w; //权值
edge(int u,int v,int v)
{
from = u;
to = v;
w = v;
}
};
vector<edge> e[N];
void createGraph2()
{
for(int i = 0;i < n;i ++)
{
int r,c,w;
cin >> r >> c >> w;
e[i].push_back(edge(r,c,w));
}
}
三、链式前向星
思想与邻接表接近
结构体、head[]
(1)建结构体(终点to、与该起点相同的上一条边编号next、权值w)
(2)head[i]:存以 i 为起点的上一次存的边的编号(和next配合,遍历整个图)
(3)addedge()
struct edge{
int to;
int next;
int w;
};
int head[N];
int cnt;
void init()
{
for(int i = 0;i < n;i ++) head[i] = -1; //一开始所有点都不存在边,所以上一条以i为起点的边的编号应该是一个不存在的边编号,设为-1
}
void addedge(int u,int v,int w)
{
e[cnt].to = v;
e[cnt].next = head[u];
head[u] = cnt ++; //更新以u为起点的上一条存储的边
}
void createGraph3()
{
for(int i = 0; i< n;i ++)
{
int r,c,w;
cin >> r >> c >> w;
addedge(r,c,w);
}
}
for(int i = 0;i < n;i ++)
{
//只要有更新边
if(head[i] != -1)
{
//head是以该点为起点的最后一条边,next是上一次更新的边
for(int j = head[i];j != -1;j = e[j].next)
cout<<"edge:"<<i<<'-'<<e[j].to<<' '<<e[j].w;
}
}