简单算法模板


dijikistra模板

#include 
using namespace std;
typedef long long LL;
#define el "\n";
#define INF 0x3f3f3f3f
#define rep(i, a, b) for (int i = (a); i <= (b); i++)
const int Max = 1e4 + 3;

int n = 2021;

int gcd(int a,int b)
{
    return b == 0 ? a : gcd(b, a % b);
}

int get_minG(int a, int b)
{
      return a*b/gcd(a,b);
}

int dis[3000];
int vis[3000];
vector> g[3000];
queue q;
int dijikistra()
{
    memset(dis, 0x3f, sizeof(dis));
    //初始化边
    rep(i, 1, n)
    {
        rep(j, 1, n)
        {
            if (abs(i - j) <= 21)
            {
                g[i].push_back({ j,(get_minG(i,j)) });
            }
        }
    }

    dis[1] = 0;
    q.push(1);
    while(!q.empty())
    {//计算更新邻接表
        int v = q.front();
        q.pop();
        for (auto it : g[v])
        {
            int u = it.first;
            int cost = it.second;
            if (dis[u] > dis[v] + cost)
            {//更新路径
                dis[u] = dis[v] + cost;
                if (!vis[u])
                {
                    vis[u] = 1;
                    q.push(u);
                }
            }
        }
    }

    return dis[2021];

}
int main()
{
    cin.tie(0);
    cout.tie(0);

    
    cout<

并查集模板

#include
using namespace std;
const char el = '\n';
typedef long long ll;
#define rep(i,a,b) for (int i = (a);i <= (b);i++)
const int N = 2e5 + 10;

int c[30200];//花费
int fa[30200];//父亲 
 
int find(int x)
{
	return fa[x] = (fa[x]==x) ? x : find(fa[x]);
}


int main() {
	cin.tie(0);
	cout.tie(0);
	
/*
	n 表示通知给每个人的花费
	m 行给出
	人数 学生1 2 3 4 
*/ 
	int n , m ;
	cin >> n >>m;
	rep(i,1,n)
	{ 
		cin>>c[i];
		fa[i] = i; 
	}
	
	rep(i,1,m)
	{
		int x , first,second;
		cin >> x;
		cin >> first;
		int fa1,fa2;
		rep(i,2,x)
		{
			cin >> second;
			fa1 = find(first);
			fa2 = find(second);
			fa[fa1] = fa2;
		}
	}
	
	set se;
	//最小花销
	 rep(i,1,n)
	 {
	 	int f = find(i);//找到最终父节点
		 if(se.find(f) == se.end())
		{
			se.insert(f);
		} 
		if(c[f] > c[i])
		{
			c[f] = c[i];
		}
	 }
	 
	 int ans = 0;
	 for(auto it : se)
	 {
	 	ans+=c[it];
	 }
	
	cout<

欧几里得

int gcd(int a,int b)
{
    return b==0?a:gcd(b,a%b);
}

各种STL库用迭代器遍历

#include
using namespace std;

int main() {
    //map 遍历
	map mp;
	mp[1] = 2;
	
	for(map::iterator it = mp.begin();it!=mp.end();it++)
	{
		cout<first<second< se;
	se.insert(3);
	for(set::iterator it = se.begin();it!=se.end();it++)
	{
		cout<<*it< ve;
	ve.push_back(4);
	for(vector::iterator it = ve.begin();it!=ve.end();it++)
	{
		cout<<*it< q;
	q.push(5);
	while(!q.empty())
	{
		cout< s;
	s.push(6);
	while(!s.empty())
	{
		cout< > ves;
	ves.push_back({7,8});
	pair iter;
	for(vector >::iterator it = ves.begin();it!=ves.end();it++)
	{
		iter = *it;
		cout<