蒟蒻存图

通往蒟蒻的最短路(存图篇)

今天蒟蒻想学最短路
但是本蒟蒻不会存图
于是只好学习一下怎么存图

1.不管不顾直接刚——临接矩阵
优点:简单、易行、直观
缺点:效率低、占用内存大
可解少量图最大 mp[1000][1000];
代码就不上了,重要的在后面。

2.伸缩变换无穷尽——邻接表
作为还没学链表的蒟蒻,只学会了vector版邻接表
用结构体捆绑to和l,之后塞进起点对应的vector
能满足大多数情况下的要求
比之邻接矩阵,编写难度大了一些,但是更耐操广泛

///邻接表vector版存图
///大多数情况可用,数据太大可改用链式前向星
#include<bits/stdc++.h>
using namespace std;
struct node
{
    int to;///所连接的节点
    int l;///长度
};
vector<node>ve[10005];
int main()
{
    int n;
    ///for(int i=1;i<=结点数;i++) ve.clear();
    for(int i=1;i<=n;i++)
    {
        node edge;
        int x,y,l;
        scanf("%d%d%d",&x,&y,&l);///依次输入,开始节点,结束节点,距离
        edge.to=y;
        edge.l=l;
        ve[x].push_back(edge);
    }
}
///

3.名字好听高大上——链式前向星
应该可以满足绝大多数题了,比之vector更抽象了一些
如果vector被莫名卡掉,就换它吧

///链式前向星存图
///存图战斗机
#include<bits/stdc++.h>
using namespace std;
struct node///与vector不同,结构体中要多储存一个next
{
    int to;
    int l;
    int next;///储存上一个同一个起点的编号
}edge[10005];
int head[10005];///用来保存上一个以i为起点的节点编号
int top;///用来表示当前的序号
int main()
{
    int n;
    top=0;///准备
    ///top=1;(top=1时head可以memset为0)
    memset(head,-1,sizeof(head));
    for(int i=1;i<=n;i++)
    {
        int x,y,l;
        scanf("%d%d%d",&x,&y,&l);
        edge[top].next=head[x];///让他的next等于上一个起点为x的数据的节点编号,如果之前没有,就为-1
        edge[top].to=y;
        edge[top].l=l;
        head[x]=top;///更新
        top++;///更新编号
    }
}
遍历方法
for(int i=head[x];i!=-1/*打头的那个head[x]==-1*/;i=edge[i].next)
{
    int to=edge[i].to;
    int l=edge[i].l;
}


就酱~
武器准备就绪,下一篇就开始进入最短路咯~

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值