邻接表可以理解成 现在有一个pre的数组其中 pre【1】就是1这个节点最后出现在那条边上,如果是为3 ,那么
edge【3】中 也有与1这个邻接的点 和权值,并且还有一个edge【3】.next这个东西,这个东西是表示1在三条边之前还在哪里,一直的找,之到第一条关于1的边上为止,这时候edge的next的值是-1表示它没有上面的边了,这个就是他最开始放的边。这种储存的方法,可以减少内存的空间 ,因为我们平时是要开出n*n的空间,而且找的时候也是需要O(n)的时间,所以邻接表的优点是很明显的。
不懂得可以模拟该过程,很容易看懂的。
<span style="font-size:18px;"> #include
#include
using namespace std;
const long edge_maxn = 1005; //边的最大上限
const long point_maxn = 105; //点的最大上限
struct node
{
int v; //终点位置
int w; //权值
int next; //同一起点的下一条边存储在edge数组中的位置(理解了这个静态邻接表就可以了)
}edge[edge_maxn];
int pre[point_maxn]; //以该点为起点的第一条边存储在edge数组中的位置
int n; //点的数量
int m; //边的数量
void Init()
{
memset(pre,-1,sizeof(pre));
int Index = 1;
int i,x,y,w;
for(i=0;i
{
scanf("%d%d%d",&x,&y,&w);
edge[Index].v = y;
edge[Index].w = w;
edge[Index].next = pre[x]; //保存x起点的上一条边在edge数组中的位置
pre[x] = Index++; //位置更新
}
}
void print()
{
for(int i=1;i<=n;i++)
{
printf("%d\n",i);
for(int j=pre[i];j!=-1;j=edge[j].next)
{
printf(" -> %d value is %d\n",edge[j].v,edge[j].w);
}
//printf("/n");
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF && (n!=0 || m!=0))
{
Init();
print();
}
return 0;
}
</span>