参考博客http://blog.csdn.net/acdreamers/article/details/16902023
前向星是一种特殊的边集数组,我们把边集数组中的每一条边按照起点从小到大排序,如果起点相同就按照终点从小到大排序,
并记录下以某个点为起点的所有边在数组中的起始位置和存储长度,那么前向星就构造好了.
链式前向星是前向星的升级版,不用经历时间复杂度为O(nlogn)的快排,就能够把相同起点的边按照终点又大到小的顺序进行输出;
进行存图和输出图的代码(设每条边的代价均为1)
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int ednum;
int nodnum;
int cnt;
int head[100];//此处对应的是点
//head[i]表示存储边集中,以i为起点的第一条边的位置;
struct edge
{
int u;//起点
int v;//终点
int w;//改变对应的代价
int next;//相同起点下一个边的位置
}edge[100];//此处对应的是边
void add(int u, int v, int w)
{
edge[cnt].u = u;
edge[cnt].v = v;
edge[cnt].w = w;
edge[cnt].next = head[u];
head[u] = cnt ++;
}
int main()
{
cnt = 0;
memset(head,-1,sizeof(head));
scanf("%d %d", &nodnum, &ednum);
for(int i = 0; i < ednum; i ++)
{
int u, v, w;
scanf("%d %d %d", &u, &v, &w);
add(u,v,w);
}//输入:
// 5 7
// 1 2 1
// 2 3 1
// 3 4 1
// 1 3 1
// 4 1 1
// 1 5 1
// 4 5 1
for(int i = 1; i <= nodnum; i ++)
{
for(int j = head[i]; ~j; j = edge[j].next)//~j代表只要不是-1就满足条件,-1二进制存储全为1,~后为0
{
printf("u = %d v = %d\n", i, edge[j].v);
}
}
//输出:
// u = 1 v = 5
// u = 1 v = 3
// u = 1 v = 2
// u = 2 v = 3
// u = 3 v = 4
// u = 4 v = 5
// u = 4 v = 1
return 0;
}