1.vector二维数组
vector二维数组可以用两种方式来表示
- vetcor嵌套vector,
vector< vector<int> > vec[N]
,在使用嵌套时vector< vector<int>(注:此处要有空格,如果没有空格可能会因为有歧义报错,这里两个>形成右移符号)>
。 - vector数组,
vector<int> vec[N]
。
可以通过vec[i][j]
来访问vector二维数组中的元素。
2.vector顺序插入
用顺序插入需要结合insert函数和lower_bound函数。首先简短介绍一下insert和lower_bound函数:
- insert函数:
insert
函数是vector容器的成员函数之一,用于在指定位置插入一个或多个元素。它接受两个迭代器参数,第一个参数指定了插入位置,第二个参数指定了要插入的元素。插入操作后,原来在插入位置及其后面的元素将被移动到新的位置,以便为新元素腾出空间。格式如:vec.insert(pos, value);
- lower_bound函数:
lower_bound
函数用于查找在有序序列中插入一个新元素时,新元素应该插入的位置。它返回一个迭代器,指向第一个大于或等于给定值的元素的位置。如果没有大于或等于给定值的元素,则返回指向容器末尾的迭代器。格式如:lower_bound(vec.begin(), vec.end(), value);
结合上述两个函数可以实现vector的顺序插入:
- 首先,使用
lower_bound
函数找到新元素应该插入的位置。例如:auto it = std::lower_bound(vec.begin(), vec.end(), value);
- 然后,利用
insert
函数在该位置插入新元素。例如:vec.insert(it, value);
- 综上,即可以通过
vec.insert(lower_bound(vec.begin,vec.end(),value),value);
来实现顺序插入
基于上述vector技巧1和2的例题应用,洛谷P5318 【深基18.例3】查找文献 题解代码如下:
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+3;
vector<int> g[N]; //vector二维数组存邻接点
int n,m;
int vis[N],vis1[N];
int zc;
void dfs(int x)
{
vis[x]=1;
cout<<x<<" ";
for(int i=0;i<g[x].size();++i)
{
zc=g[x][i];
if(vis[zc]==0)
{
dfs(zc);
}
}
}
void bfs(int x)
{
queue<int> q;
q.push(x);
cout<<x<<" ";
vis1[x]=1;
while(q.size()!=0)
{
int qzc=q.front();
for(int i=0;i<g[qzc].size();i++)
{
if(vis1[g[qzc][i]]==0)
{
q.push(g[qzc][i]);
cout<<g[qzc][i]<<" ";
vis1[g[qzc][i]]=1;
}
}
q.pop();
}
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>m;
int a,b;
for(int i=1;i<=m;++i)
{
cin>>a>>b;
g[a].insert(lower_bound(g[a].begin(),g[a].end(),b),b);
//实现顺序插入,存每个点的邻接点
}
dfs(1);
cout<<endl;
bfs(1);
return 0;
}
用vector二维数组来存每个顶点的邻接点,由于题中要求如果有很多篇文章可以参阅,请先看编号较小的那篇(因此你可能需要先排序),故在存邻接点的时候可以直接用顺序插入,当然也可以存完在用sort。