c++ 竞赛常用函数模板

三路快排

void Quicksort(int l, int r) 
{
    if (l >= r) return;

    int key = arr[rand() % (r - l + 1) + l];
    int i = l, j = l, k = r;

    while (i <= k) 
	{
        if (arr[i] < key) 
		{
            swap(arr[i++], arr[j++]);
        } 
		else if (arr[i] > key) 
		{
            swap(arr[i], arr[k--]);
        } 
		else 
		{
            ++i;
        }
    }

    Quicksort(l, j - 1);
    Quicksort(k + 1, r);  
}

DFS(深度优先搜索)


void dfs(int cur, vector<int>& visited, vector<vector<int>>& graph) 
{
    visited[cur] = 1; // 标记当前节点已经被访问
    // 处理当前节点cur
    for (int i = 0; i < graph[cur].size(); i++) 
    {
        int next = graph[cur][i];
        if (!visited[next]) 
        { // 如果下一个节点未被访问
            dfs(next, visited, graph); // 继续访问下一个节点
        }
    }
}
void dfsTraversal(vector<vector<int>>& graph) 
{
    int n = graph.size();
    vector<int> visited(n, 0); // 初始化访问数组
    for (int i = 0; i < n; i++) 
    {
        if (!visited[i])
        { // 如果当前节点未被访问
            dfs(i, visited, graph); // 从当前节点开始进行深度优先遍历
        }
    }
}

(BFS)广度优先搜索

void bfsTraversal(vector<vector<int>>& graph) 
{
    int n = graph.size();
    vector<int> visited(n, 0); // 初始化访问数组
    queue<int> q;
    for (int i = 0; i < n; i++) 
    {
        if (!visited[i]) 
        { // 如果当前节点未被访问
            q.push(i); // 将当前节点加入队列
            visited[i] = 1; // 标记当前节点已经被访问
            while (!q.empty()) 
            { // 循环遍历队列中的节点
                int cur = q.front();
                q.pop();
                // 处理当前节点cur
                for (int j = 0; j < graph[cur].size(); j++) 
                {
                    int next = graph[cur][j];
                    if (!visited[next]) 
                    { // 如果下一个节点未被访问
                        q.push(next); // 将下一个节点加入队列
                        visited[next] = 1; // 标记下一个节点已经被访问
                    }
                }
            }
        }
    }
}

二分查找

int find(int arr[],int left,int right,int key)
{
    while (left<=right)
    {
        int mid =(right+left)/2;
        if (key==arr[mid]) return mid;
        if (key>arr[mid]) left=mid+1;
        if (key<arr[mid]) right=mid-1;
    }
    return -1;
}
posted @ 2024-01-27 14:15  NexusXian  阅读(44)  评论(0编辑  收藏  举报
Nephrenn‘s Blog