邻接表来存储一个图

//用邻接表来存储一个图
int n, m, i;
int u[6], v[6], w[6];
int first[5], next[5];
scanf("%d%d", &n, &m);
//初始化first数组下标1~n的值为-1, 表示1~n顶点暂时都没有边
for(i = 1; i <= n; ++i)
    first[i] = -1;
for(i = 1; i <= m; ++i)
{
    scanf("%d %d %d", &u[i], &v[i], &w[i]); //读入每一条边
    //下面两句是关键啦
    next[i] = first[u[i]];
    first[u[i]] = i;
}

//遍历每个顶点的边
for(i = 1; i <= n; ++i)
{
    k = first[i];
    while(k != -1)
    {
        printf("%d %d %d\n", u[k], v[k], w[k]);
        k = next[k];
    }
}

/*
first[i]:以i为起点的边的编号,没有的话设为-1
next[i]:编号为i的边的前一条边的编号,同样的,没有也设为-1
(前一条边:与当前边(也就是i)同一个起点的边,只不过是比i早搜到,早储存)

first[i]再储存完之前一直存的是搜到的第一条以i为起点的边的编号,
but,如果有另一条以i为起点的边,
则next[另一条以i为起点的边的编号]=第一条以i为起点的边的编号,记录了两次,
∴若以i为起点的边>=3(反正就是比较多,不一定>=3),
则它可以存最后搜到的以i为起点的边的编号

遍历边的时候,其实是取的边的编号

总之,first和next都是记录的边的编号
*/

  

转载于:https://www.cnblogs.com/mjn1/p/9905342.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值