第一行照例留给本鸽子精咕咕咕。
第二行感谢耐心给我讲图到很晚的mfz师哥(并且还能不嫌弃我菜qwq超级感谢)(因为师哥讲的很细所以奇迹般地我现在还记得再次感谢)。
第三行感谢认真讲图的csb师哥。
图的存储方法+遍历——
1.邻接矩阵(二维数组)
储存
memset(n, 0, sizeof(n));
for(int i = 0; i < n; ++i)//n是边的个数
{
cin>>a>>b>>c;//a表示起始点b表示指向点c表示权值
edge[a][b] = c;
}
遍历同上循环即可。
2.邻接表(vector)
储存
struct tu
{
int v,len;//v是指向点,len是权值
}
vector<tu>edge[maxn];
for(int i = 0; i < maxn; ++i)
{
edge[i].clear();//初始化vector
}
for(int i = 0; i < n; ++i)//n为边数
{
cin>>a>>b>>c;//输入起始点指向点权值
tu ed;//存最新的边
ed.v = b;
ed.len = c;
edge[a].push_back(ed);
}
遍历
for(int i = 0; i <= maxn; ++i)//maxn为最大起始点
{
int s = edge[i].size();//据c师哥说放在循环里会有耗时
for(int j = 0; j < s; ++j)
{
tu edg = edge[i][j];
int v1 = edg.v, len1 = edg.len;
}
3.链式前向星
存储
struct tu
{
int u,v,len,next;
}edge[maxn];
int cnt = 0, head[maxn];//需初始化head为-1,表示没有边
void add(int u, int v, int len)
{
edge[cnt].u = u;//起始点
edge[cnt].v = v;//指向点
edge[cnt].len = len;//权值
edge[cnt].next = head[u];//上一条起始点相同的边
head[u] = cnt++;//下一条边
}
遍历
for(int i = head[u]; i != -1; i = edge[i].next)//遍历所有起点为u的边
{
int v = edge[i].v;
int len = egde[i].len;
//进行操作
}
请忽略我忘了在函数里写循环……
明白意思就好qwq
欢迎指出错误。