【模板】邻接表
该比赛已结束,您无法在比赛模式下递交该题目。您可以点击“在题库中打开”以普通模式查看和递交本题。
Description
注:本题与【模板】邻接矩阵区别在于 $n,m$ 范围不同和操作 2 的次数不同。
用邻接矩阵维护一个有 $n$ 个点的图,支持以下四种操作:
$1.$ 在 $a,b$ 间连边。
$2.$ 在 $a,b$ 间删边。
$3.$ 判断 $a,b$ 之间是否存在边。
$4.$ 输出和 $a$ 之间有边的点。
共进行 $m$ 操作,对于每个 $3,4$ 操作,输出相应的结果。
保证操作 $2$ 的次数不超过 $10$ 次。
Input Format
第一行一个整数 $m$ 表示操作次数。
接下来 $m$ 行,每行包含一个操作命令,操作命令可能是以下几种:
$1.$ a a b
,在 $a,b$ 间连边。
$2.$ d a b
,在 $a,b$ 间删边。
$3.$ c a b
,判断 $a,b$ 之间是否存在边。
$4.$ q a
,输出和 $a$ 之间有边的点。
Output Format
对于每个操作 $3,4$ 输出一行或两行表示一个结果,对于操作 $3$,如果 $a,b$ 之间存在边,一行输出Yes
,否则输出 No
;对于操作 $4$,第一行先输出和 $a$ 之间有边的点的个数,第二行按连边的先后顺序输出所有和 $a$ 之间有边的点。
6
a 1 2
a 2 3
c 2 3
c 1 3
d 1 2
q 1
Yes
No
0
Hint
$1≤n≤10^6,1≤m≤\min\{10^6,\dfrac{n(n-1)}{2}\}$
方法一:
vector<int> a;
末尾添加元素:a.push_back(x);
删除末尾元算:a.pop_back();
获取长度:a.size();
查找元素:find(a.begin(),a.end(),x);
元素删除:a.erase(a.begin()+下标);
遍历/访问:1、可以通过下标遍历
2、通过迭代器遍历vector<int>::iterator it;for(it=a.begin();it!=a.end();it++){//遍历cout<<*it<<" ";}
方法二:链式前向星(数组模拟邻接表)