图的存储有多种方式,对于稀疏图,可以用邻接表来存储,对于稠密图,可以用邻接矩阵存储
在实际的考试中,使用vector(动态数组)能十分便捷地存储稀疏图
例题:
第四届蓝桥杯A组真题:大臣的旅费
题目链接:
https://www.acwing.com/problem/content/description/1209/
这题中,需要存储节点数量较大, 属于稀疏图
需要使用vector存图后,找到图的直径
闫老板在相关讲解中,提到了如下几点:
- 1.定义一个结构体 ,第一个点是编号,第二个是长度,这个结构体用于存储每一条边
struct Edge{
int id,w;
};
- 2.开N个类型为Edge的vector,用于存图,
vector<Edge> h[N];
- 3.由于是无向图,对于每一条输入,需要添加a->b和b->a两条边,这里需要注意vector中,push_back()的使用
for(int i=0;i<n-1;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
h[a].push_back({b,c});
h[b].push_back({a,c});
}
- 关于vector的遍历方式:
C11引入了一种新的遍历方式:void dfs(int u,int father,int distance) { dist[u]=distance; for(auto node :h[u]) //C11新的遍历方式 { if(node.id!=father) { dfs(node.id,u,distance+node.w); } } }