前向星是一种通过存储边信息的方式存储图的数据结构。它的构造方式非常简单,读入每条边的信息,将边存放在数组中,把数组中的边按照起点顺序排序,前向星就构造完成了
但是为了查询方便,会有一个数组存储起点为Vi的第一条边的位置
#include<iostream.h>
#include<stdlib.h>
#include<algorithm>
const int maxn=100;
const int maxm=100;
int head[maxn];
struct NODE
{
int from;
int to;
int w;
};
NODE edge[maxm];
//利用c++的STL排序函数 qsort()
int cmp(const void *a,const void * b)
{
if(((NODE *)a)->from==((NODE *)b)->from&&((NODE *)a)->to==((NODE *)b)->to)return ((NODE *)a)->w < ((NODE *)b)->w;
if(((NODE *)a)->from==((NODE *)b)->from) return ((NODE *)a)->to < ((NODE *)b)->to;
return ((NODE *)a)->from < ((NODE *)b)->from;
}
int main()
{
int n,m;
//读入数据
//********************************************
cin>>n>>m;
for(int i=0;i<m;i++)
cin>>edge[i].from>>edge[i].to>>edge[i].w;
qsort(edge,m,sizeof(NODE),cmp); //排序
memset(head,-1,sizeof(head));
head[edge[0].from]=0; //初始化
for(i=1;i<m;i++)
if(edge[i].from!=edge[i-1].from)
head[edge[i].from]=i; //确定起点为Vi的第一条边的位置
//********************************************
//遍历代码
for(i=1;i<=n;i++)
{
for(int k=head[i];edge[k].from==i&&k<m;k++) //若找到起点则输出
{
cout<<edge[k].from<<' '<<edge[k].to<<' '<<edge[k].w<<endl;
}
}
//********************************************
return 0;
}