通往蒟蒻的最短路(存图篇)
今天蒟蒻想学最短路
但是本蒟蒻不会存图
于是只好学习一下怎么存图
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;
}
就酱~
武器准备就绪,下一篇就开始进入最短路咯~