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;
}