前向星是一种特殊的边集数组,我们把边集数组中的每一条边按照起点从小到大排序,如果起点相同就按照终点从小到大排序,
并记录下以某个点为起点的所有边在数组中的起始位置和存储长度,那么前向星就构造好了.
初始位置u[i],终止位置v[i],权w[i]。
first[i]初始值全为-1。
first[i],它是用来表示以i为起点的第一条边存储的位置,实际上你会发现这里的第一条边存储的位置其实
在以i为起点的所有边的最后输入的那个编号.
next[i],数组存编号为i的边的上一条边的编号,如果这个边是以u[i]为顶点的第一条边,则next[i]为-1。
下面为代码:
#include <iostream>
#include <cstring>
#include <algorithm>
#define inf 0x3f3f3f3f
using namespace std;
int main()
{
int n,m; //点的个数,边的条数
int u[6],v[6],w[6]; //起始,终止,权
int first[5],next[5]; //当前值的第一条边的存储位置(实际是当前值最后输入的那条边),当前值的上一条边的存储位置,初始为-1
cin>>n>>m;
for(int i=1;i<=n;i++)
{
first[i]=-1; //初始全为-1
}
for(int i=1;i<=m;i++)
{
cin>>u[i]>>v[i]>>w[i];
//核心代码!
next[i]=first[u[i]];
first[u[i]]=i;
}
for(int i=1;i<=m;i++) //遍历
{
int k=first[i];
while(k!=-1)
{
cout<<u[k]<<" "<<v[k]<<" "<<w[k]<<endl; //下标是k
k=next[k]; //类似链表
}
}
return 0;
}
/* 9 5
1 4 9
4 3 8
1 2 5
2 4 6
1 3 7 */