链式前向星
writer:pprp
分析:比较难以理解,关键代码其实很短
如下:
结点声明:
int head[maxn];//表示以i为起点的第一条边的存储位置
struct node
{
int to;//第i条边的终点
int w;//第i条边的权值
int next;//与第i条边同起点的下一条边的存储位置
};
node e[maxn];
建立语句:
for(int i = 0 ; i < ee; i++)
{
//i是第几条边
cin >> x >> y >> z;
e[i].to = y;
e[i].w = z;
//第i条边下一个指向起点x所指向的边
e[i].next = head[x];
//起点x指向第i条边
head[x] = i;
}
遍历语句:
for(int i = 0 ; i < vv; i++)
for(int k = head[i]; k != -1 ; k = e[k].next)
cout << "op:" << k << " ed:" << e[k].to << " w:" << e[k].w << endl;
具体分析见图:
与前向星的区别:
前向星存在一个排序算法,而链式前向星算法在建立过程中没有用到排序,直接可以将某一个顶点的下一个边,下一个边存储起来,找完为止,分析如上图所示:
在建立的过程中,是正着来的,在遍历的过程中是倒过来的
参数解释:
head[i]: 保存的是以i为起点的所有边中编号最大的那个,而把这个当作顶点i的第一条起始边的位置
e[i].next: 表示与第i条边同起点的下一条边的存储位置
具体代码如下:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1000;
struct node
{
int to;
int w;
int next;
};
int head[maxn];
node e[maxn];
int main()
{
int vv, ee;
int x, y, z;
cin >> vv >> ee;
memset(head,-1,sizeof(head));
for(int i = 0 ; i < ee; i++)
{
//i是第几条边
cin >> x >> y >> z;
e[i].to = y;
e[i].w = z;
//第i条边下一个指向起点x所指向的边
e[i].next = head[x];
//起点x指向第i条边
head[x] = i;
}
for(int i = 0 ; i < vv; i++)
cout << head[i] << ' ';
cout << endl;
for(int i = 0 ; i < ee; i++)
{
cout << i << ":" << e[i].to << " " << e[i].w << " " << e[i].next << endl;
}
for(int i = 0 ; i < vv; i++)
for(int k = head[i]; k != -1 ; k = e[k].next)
cout << "op:" << k << " ed:" << e[k].to << " w:" << e[k].w << endl;
return 0;
}