ACM基础算法复习(STL + DFS + BFS + 并查集 + 快速幂 + 欧几里得算法)

从进队到现在,师哥们陆陆续续讲了很多基础算法,对我这种菜鸡而言没有什么基础,感觉都挺难的,所以还是复习复习,看看还有多少没还给师哥的。。。

上课的内容大致有以下几个模块(C语言基础和python姑且不算)
1. STL
2. DFS + BFS
3. 并查集
4. 快速幂 + 欧几里得算法

1.STL之vector
把搜到关于vector的基本知识点列一下
1.push_back 在数组的最后添加一个数据

2.pop_back 去掉数组的最后一个数据

3.at 得到编号位置的数据

4.begin 得到数组头的指针

5.end 得到数组的最后一个单元+1的指针

6.front 得到数组头的引用

7.back 得到数组的最后一个单元的引用

8.max_size 得到vector最大可以是多大

9.capacity 当前vector分配的大小

10.size 当前使用数据的大小

11.resize 改变当前使用数据的大小,如果它比当前使用的大,者填充默认值

12.reserve 改变当前vecotr所分配空间的大小

13.erase 删除指针指向的数据项

14.clear 清空当前的vector

15.rbegin 将vector反转后的开始指针返回(其实就是原来的end-1)

16.rend 将vector反转构的结束指针返回(其实就是原来的begin-1)

17.empty 判断vector是否为空

18.swap 与另一个vector交换数据

vector c.
c.clear() 移除容器中所有数据。

c.empty() 判断容器是否为空。

c.erase(pos) 删除pos位置的数据

c.erase(beg,end) 删除[beg,end)区间的数据

c.front() 传回第一个数据。

c.insert(pos,elem) 在pos位置插入一个elem拷贝

c.pop_back() 删除最后一个数据。

c.push_back(elem) 在尾部加入一个数据。

c.resize(num) 重新设置该容器的大小

c.size() 回容器中实际数据的个数。
c.begin() 返回指向容器第一个元素的迭代器
c.end() 返回指向容器最后一个元素的迭代器

关于vector的用法我只能算了解,以后多做题多积累
这里挂一道oj上刚做的题
sdnu 1057 树的查询
Description
给定 n(1 <= n <= 1000000), m(1 <= m <= 10) 分别表示一棵树中节点的个数及查询的数量,每个节点的编号为给定的顺序,之后给定每个节点的父节点编号,及 m 个查询,每个查询中,给定一个节点编号,对于每个查询,按编号从小到大输出该节点所有子节点。
Input
第一行两个整数n, m,之后n行,每行两个整数a, b,表示编号为a的节点的父节点是b,b为0表示没有父节点,数据保证编号为1至n的节点均在a位置出现一次,之后一行m个整数,表示每个查询要查询的节点编号。
Output
m行,每行若干个从小到大排好序的、用一个空格隔开的整数,表示该次查询的节点的所有子节点。
Sample Input
5 1
1 0
4 1
2 1
5 1
3 1
1
Sam Output
2 3 4 5

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
using namespace std;
vector<int>v[1010010];
int main()
{
    int n,m;
    int a,b;
    int first;
    scanf("%d%d",&n,&m);
    for(int i = 0; i < n; i ++)
        {
            cin>>a>>b;
            if(b == 0)continue;
            v[b].push_back(a);

        }
    while(m--)
    {
        cin>>a;
        first = 1;
        for(int j = 0; j < v[a].size(); j ++)
        sort(v[a].begin(),v[a].end());
        for(int j = 0; j < v[a].size(); j ++)
        {
            if(first == 1)
            {
                cout<<v[a][j];
                first = 0;
                continue;
            }
            cout<<' '<<v[a][j];
        }
        cout<<endl;
    }
    return 0;
}

都是基础用法就不解释了,很水。
这算复习完vector?那接下来stack,map,queue就不一个一个找题了,和vector有很多共性,一定要多积累。

SET基本操作:
begin()    ,返回set容器的第一个元素
end()      ,返回set容器的最后一个元素
clear()    ,删除set容器中的所有的元素
empty()    ,判断set容器是否为空
max_size()   ,返回set容器可能包含的元素最大个数
size()      ,返回当前set容器中的元素个数
rbegin     ,返回的值和end()相同
rend()     ,返回的值和rbegin()相同

QUEUE基本操作:
back()返回最后一个元素
empty()如果队列空则返回真
front()返回第一个元素
pop()删除第一个元素
push()在末尾加入一个元素
size()返回队列中元素的个数
queue入队,如例:q.push(x); 将x 接到队列的末端。
queue出队,如例:q.pop(); 弹出队列的第一个元素,注意,并不会返回被弹出元素的值。
访问queue队首元素,如例:q.front(),即最早被压入队列的元素。
访问queue队尾元素,如例:q.back(),即最后被压入队列的元素。
判断queue队列空,如例:q.empty(),当队列空时,返回true。
访问队列中的元素个数,如例:q.size()

STACK基本操作
stack 的基本操作有:
入栈,如例:s.push(x);
出栈,如例:s.pop();注意,出栈操作只是删除栈顶元素,并不返回该元素。
访问栈顶,如例:s.top()
判断栈空,如例:s.empty(),当栈空时,返回true。
访问栈中的元素个数,如例ÿ

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值